1. 什么是Numpy?
Numpy是 Numerical Python的简称,是目前python数值计算中最为重要的基础包。这些数值计算主要包括:
- 多维数组的运算,这使你不必再编写for循环来对数组中的值进行计算。
import numpy as np
a=np.array([1,2,3])
print((a**2))
[1 4 9]#如果使用列表,那将使用for循环挨个对列表中的元素进行操作
- 随机数的生成,相比于python内建库random,np.random可根据用户需求定义随机数生成,比如最常见的按正态分布生成随机数。
- 线性代数,矩阵的运算,行列式的计算,矩阵求逆等等。
2. Numpy ndarray
Numpy的核心特征之一就是N维数组对象-ndarry。数组中的数据都是同类型的。
这个数组允许你使用类似于标量的语法在整块数据上进行数学计算。(类似于上述代码块里的平方计算)
2.1 ndarray的基本属性
- 每一个数组都有一个shape属性,用来表示数组每一维度的数量。
import numpy as np
a=np.array([[1,2,3],[2,3,4]])
print(a.shape)
(2, 3)#2行3列
- 每一个数组都有一个dtype属性,用来表示数组的数据类型。
import numpy as np
a=np.array([[1,2,3],[2,3,4]])
print(a.dtype)
int32
2.2 ndarray的生成
可使用np.x()的以下函数方法生成数组。
函数名 | 描述 |
---|---|
array | 将输入数据(可以是列表、元组、数组以及其他序列)转换为ndarray |
asarray | 将输入数据转换为ndarray,但如果输入已经是ndarray则不再复制(指向同一块内存,不再进行深拷贝) |
arange | python内建函数range的数组版,返回一个数组 |
ones | 根据给定形状和数据类型生成全1数组 |
ones_like | 根据所给的数组形状生成一个一样的全1数组 |
zeros | 根据给定形状和数据类型生成全0数组 |
zeros_like | 根据所给的数组形状生成一个一样的全0数组 |
empty | 根据给定形状和数据类型生成初始值为空的数组 |
empty_like | 根据所给的数组形状生成一个一样的初始值为空的数组 |
full | 根据给定形状和数据类型生成内容为指定数值的的数组 |
full_like | 根据所给的数组形状生成一个一样的内容为指定数值的数组 |
eye,identity | 生成一个N*N的特征矩阵(主对角线位置全1,其余位置全0) |
想使用np.empty生成一个全0数组并不安全,有时候它可能会返回未初始化的垃圾数值。
小tip:arrange方法只能给定一个参数,即生成0到几的一维数组,如果想生成高维数组需要用到reshape()方法。
import numpy as np
a=np.arange(10)
print(a)
print(a.reshape(2,5))
[0 1 2 3 4 5 6 7 8 9]#print(a)
[[0 1 2 3 4]
[5 6 7 8 9]]#print(a.reshape(2,5))
2.3 ndarray的基础索引与切片
- 一维数组的索引和切片与python中的列表类似。不过如果你传递了一个数值给数组的切片,数值将会传递给原数组。区别于python的内建列表,数组的切片是原数组的视图,这意味着数据并不是像列表的子视图一样被复制了,任何对于原数组视图的修改都会反映到原数组上。
import numpy as np
l=["wuo","a"]
a=l[0:1]
a[0:1]="1"
print(l)
a=np.array(l)
a_slice=a[0:1]
a_slice[0]="1"
print(a)
['wuo', 'a']#对列表视图数据的修改并没有反映到原列表上
['1' 'a']#对数组视图数据的修改反映到了原数组上!
如果你还是想要一份数组切片的拷贝而非一份视图的话,你就必须显式地复制这个数据,如a[0:1].copy()。
- 对于更高维度的数组,你会有更多选择。在一个二维数组中,每个索引值对应的便不再是一个值,而是一个一维数组。
以下方式是等效的:
a[0][2]==a[0,2]
虽然是等效的,但依然建议使用a[0,2]这种形式。
与python列表的一维对象类似,数组可以通过类似的语法进行切片,同时注意,对切片表达式赋值时,整个切片都会重新赋值:
import numpy as np
a=np.eye(2,dtype=np.int32)
print(a)
print(a[1:,1])
a[1:]=233
print(a)
[[1 0]
[0 1]]#print(a)
[1]#print(a[1:,1])
[[ 1 0]
[233 233]]#print(a)
2.4 ndarray的布尔索引
数组可以按布尔值自行判定输出。
import numpy as np
a=np.arange(5)
con=a>0
print(con,a,a[con])
[False True True True True] [0 1 2 3 4] [1 2 3 4]
python关键字and和or对布尔值数组并没有用,请使用 & 和 | 来代替。
2.5 ndarray的神奇索引
为了选出一个符合特定顺序的子集,可以手动指定顺序。(看例子就懂了)
import numpy as np
a=np.eye(5)
print(a[[1,0,2,3,4]])
[[0. 1. 0. 0. 0.]
[1. 0. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]
请注意,神奇索引与切片不同,它总是将数据复制到一个新的数组中。
2.6 数组转置和换轴
转置是一种特殊的数据重组方法,可以返回底层数据的视图而不需要复制任何内容。数组拥有 np.transpose() 方法,当然也有 .T 属性。
import numpy as np
a=np.eye(5)
b=a[[1,2,0,3,4]]
print(b)
print(b.T)
print(np.transpose(b))
[[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[1. 0. 0. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]#print(b)
[[0. 0. 1. 0. 0.]
[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]#print(b.T)
[[0. 0. 1. 0. 0.]
[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]#print(np.transpose(b))
对于高维数组,transpose方法可以接收包含轴编号的元组,用于置换轴。
import numpy as np
a=np.arange(16)
a=a.reshape(2,2,4)
print(a)
print(a.transpose(1,0,2))
[[[ 0 1 2 3]
[ 4 5 6 7]]
[[ 8 9 10 11]
[12 13 14 15]]]#print(a)
[[[ 0 1 2 3]
[ 8 9 10 11]]
[[ 4 5 6 7]
[12 13 14 15]]]#print(a.transpose(1,0,2))
2.7 数组常用函数
以下方法都可以用np.x() 的方式实现。函数方法分为一元和二元
补充两个
函数名 | 描述 |
---|---|
abs、fabs | 逐个元素计算整数浮点数或复数的绝对值 |
sqrt | 计算每个元素的平方根(与arr**0.5相等) |
square | 计算每个元素的平方(与arr**2相等) |
2.8 数组中的条件逻辑
np.where()函数是三元表达式 x if condition else y 的向量化版本。常用情况如下(将一个数组中所有正值设为1,负值设为-1):
import numpy as np
a=np.random.randn(4,4)
print(a)
a=np.where(a>0,1,-1)
print(a)
[[ 0.04664653 -1.28451618 0.26419826 0.67257034]
[ 0.02606113 0.85478368 1.06234863 0.7205168 ]
[ 2.20376876 -1.07733641 0.18353773 -1.32409947]
[ 0.69560828 1.66952173 0.18963199 -0.31033506]]
[[ 1 -1 1 1]
[ 1 1 1 1]
[ 1 -1 1 -1]
[ 1 1 1 -1]]
2.9 数组中的数学统计方法
以arr.x()的形式使用,基础数组同济方法:
方法 | 描述 |
---|---|
sum | 计算所有元素的和 |
mean | 计算平均值 |
std,var | 标准差和方差 |
min,max | 最值 |
argmin,argmax | 最值的位置 (显示为第几个数,而不是其坐标) |
cumsum | 累计和 |
sumprod | 累积积 |
2.10 布尔值数组的方法
布尔值数组有两个重要方法:
- arr.all() 检查是否arr中每个值都是True。
- arr.any() 检查arr中是否至少有一个值是True。
2.11 数组的唯一值和其他类似集合的逻辑
- np.unique() 返回数组中唯一值排序后形成的数组。
- np.in1d() 检查一个数组中的值是否在另一个数组中,并返回一个布尔型数组。
import numpy as np
a=np.random.randn(4,4)
a=np.where(a>0,1,-1)
print(a)
print(np.unique(a))
print(np.in1d(a,[0,1]))
[[ 1 1 1 1]
[ 1 -1 1 -1]
[-1 1 1 1]
[-1 1 -1 1]]#print(a)
[-1 1]#print(np.unique(a))
[ True True True True True False True False False True True True
False True False True]#print(np.in1d(a,[0,1]))
2.12 线性代数
numpy.linalg 拥有一个矩阵分解的标准函数集,以及其他常用函数,例如求逆、行列式等。
2.13 随机数生成
链接: numpy.random用法.