Numpy
数组
用list和tuple等数据结构表示数组,从列表产生数组 a=array(list)
,或直接将列表传入数组
用fill
方法将数组设为指定值
复数
虚部: a.imag
,实部: a.real
,复共轭: a.conjugate()
, 复共轭(缩写):a.conj()
数组与字符串的转换
转化为字符串:a.tostring()
用Fortran的格式,按照列来读数据: a.tostring(order='F')
从字符串中读出数据,不过要指定类型: a = np.fromstring(s, dtype=np.uint8)
ndarray的基本属性
属性 | 操作 | 属性 | 操作 |
---|---|---|---|
类型 | type(a) | 维度 | a.shape()或shape(a) |
元素类型 | a.dtype() | 元素数量 | a.size()或size(a) |
每个元素所占字节 | a.itemsize() | 元素所占空间 | a.nbytes() |
秩 | a.dim() | \ | \ |
数组创建函数
函数 | 说明 |
---|---|
array |
将输入数据(序列类型)直接转换为ndarray,要么推断处dtype,要么显示指定dtype |
asarray |
将输入转换为ndarray |
arange |
类似内置的range,但返回的的是一个ndarray而不是列表 |
linspace(start,stop,N) |
产生N个等距分布在[start, stop]间的元素组成的数组 |
logspace(start,stop,N) |
产生 N 个对数等距分布的数组,默认以10为底: |
ones ,ones_like
|
指定形状和dtype创建一个全1数组。ones_like是以另一个数组的形状和dtype为参数 |
zeros , zeros_like
|
类似ones ,ones_like ,创建全0数组 |
empty , empty_like
|
创建新数组,只分配内存空间不填充任何值 |
eye , identity
|
创建一个方阵(对角线为1,其余为0) |
meshgrid(x, y) |
生成一个网格,x对应网格的第一维,y对应网格的第二维。 |
注意:np.empty返回的都是未初始化的垃圾值
dtype=uint8
时uint8只用一个字节表示0-255整数,ord()
可以查看ASCII码
数组形状
函数 | 说明 |
---|---|
a.shape= a.reshape()
|
例如:a.shape = 2,3 等同于a.reshape(3,2)
|
newaxis |
增加数组维数,根据插入位置的不同,可以返回不同形状的数组,例如y = a[newaxis, :]
|
a.squeeze() |
去除多余的轴,返回一个将所有长度为1的维度去除的新数组 |
a.transpose() , a.T
|
返回数组的转置 |
a.flatten() |
将多维数组转化为1维数组,b = a.flatten() ,改变b并不会影响a的值 |
a.flat ,a.ravel()
|
将多维数组转化为1维数组,b = a.flat ,b = aa.ravel() ,相修改 b 的值会影响 a |
atleast_xd |
保证数组至少有x维, x可以取值1,2,3 |
索引和切片
将一个标量值赋值给一个切片时,该值会自动传播到整个选区,和列表的最重要的区别是数组切片是原始数组的视图,所以数组不会被复制,仕途上任何修改都会直接反映到源数组上。
arr=([0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
arr_slic= a[5:8]
arr_slic[:] = 64
arr
#out: array([0, 1, 2, 3, 4, 64, 64, 64, 8, 9])
如果想得到的是ndarray切片的副本而非视图,就需要显示的进行复制操作,例如arr[5:8].copy()
数组可以通过逗号隔开的索引列表来选取单个元素,所以arr2[0][2]
和arr2[0,2]
等价
布尔型索引
布尔型数组可以用于索引,布尔型数组的长度必须跟被索引的轴长度一直,此外布尔型数组和切片,整数可以混合使用
n=[True,False, False, True, False, False]
data[n,2:] #2:表示选取从第二列到最后一列的元素
data[n,3] #3表示选取第三列元素
布尔条件可以使用&(和)、|(或)之类的布尔运算符,Python关键字and和or在布尔型数组中无效
花式索引
指利用整数数组进行索引
以特定顺序选取行子集,只需传入一个用于指定顺序的整数列表或ndarray,例如arr[[4,3,0]]
。负数索引会从末尾开始选取行,例如arr[[-3,-5]]
arr[[row],[colum]]
,例如arr[[1,5,7],[0,3,1]]
np.ix_([row][colum])函数,可以用于选取方形区域的索引器,例如arr[np.ix_([1,5,7],[0,3,1])]
通用函数
通用函数(ufunc)是对ndarray中的数据执行元素级运算的函数
数组运算
运算 | 函数 | 运算 | 函数 | 运算 | 函数 |
---|---|---|---|---|---|
a + b | add(a,b) | a - b | subtract(a,b) | a * b | multiply(a,b) |
a / b | divide(a,b) | a ** b | power(a,b) | a % b | remainder(a,b) |
一元ufunc
函数 | 说明 |
---|---|
abs ,fabs
|
计算各元素绝对值,非复数值用fabs更快 |
sqrt |
计算各元素平方根 |
square |
计算各元素平方 |
exp |
计算各元素指数 |
log ,log10 ,log2 ,log1p
|
分别为底数为e, 10, 2,的log和log(1+x) |
sign |
计算各元素的正负号:1(正数),0(零),-1(负数) |
ceil |
计算各元素的ceiling值,大于等于该值得最小整数 |
floor |
计算各元素的floor值,小于等于该值的最大整数 |
rint |
将各元素四舍五入到最接近的整数,保留dtype |
modf |
将数组的小数和整数部分一两个独立数组的形式返回 |
isnan |
判断那些值是NaN的布尔型数组 |
isfinite ,isinf
|
返回一个表示哪些是有穷,哪些是无穷的布尔型数组 |
cos ,cosh ,sin sinh ,tan ,tanh
|
普通型和双曲型三角函数 |
arccos ,arccosh ,arcsin arcsinh ,arctan ,arctanh
|
反三角函数 |
logical_not |
计算各元素not x的真值,相当于-arr |
right_shift ,left_shift
|
左移和右移,右移时整数左补0,负数左补1 |
invert |
取反 |
二元ufunc
二元ufunc接受两个数组,并返回一个数组结果,少数也可以返回多个数组,例如modf
函数 | 说明 |
---|---|
add |
将数组中对应元素相加 |
subtract(A,B) |
A中减去B的元素 |
multiply |
数组元素相乘 |
divid , floor_divid
|
除法或向下圆整出发(丢弃余数) |
pow(A,B) |
计算 |
maximum ,fmax
|
元素级的最大值计算,fmax忽略NaN |
minmum ,fmin
|
元素级的最小值计算,fmin忽略NaN |
mod |
元素级的求模计算(除法的余数) |
greater ,greater_equal ,less ,less_equal equal ,not_equal
|
元素级比较,产生布尔型数组,相当于中缀运算符>,>=,<,<=,==,!= |
logical_and , logical_or , logical_xor
|
元素级的真值逻辑运算相当于中缀运算符&,^, |
copysign(A,B) |
将B中的值的符号复制给A的值 |
ufunc对象
函数 | 说明 |
---|---|
op.reduce(a) |
将op沿着某个轴应用,使得数组 a 的维数降低一维,例如a为1维数组np.add.reduce(a) 相当于求和 |
op.accumulate(a) |
accumulate 可以看成保存 reduce 每一步的结果所形成的数组。 |
op.reduceat(a, indices) |
reduceat 方法将操作符运用到指定的下标上,返回一个与 indices 大小相同的数组 |
op.outer(a, b) |
对于 a 中每个元素,将 op 运用到它和b的每一个元素上所得到的结果 |
#accumulate例子
a = np.array([1,2,3,4])
np.add.accumulate(a)
#out: array([ 1, 3, 6, 10])
a = np.array([1,1,0,1])
np.logical_and.accumulate(a)
#out: array([ True, True, False, False], dtype=bool)
#reducate例子
a = np.array([0, 10, 20, 30, 40, 50])
indices = np.array([1,4])
np.add.reduceat(a, indices)
#out: array([60, 90])
#router例子
a , b = np.array([0,1]), np.array([1,2,3])
np.add.outer(a, b)
#out:array([[1, 2, 3],[2, 3, 4]])
利用数组进行数据处理
基本数组统计方法
方法 | 说明 |
---|---|
sum() |
对数组中全部轴向元素求和sum(a) 等同a.sum() ;a.sum(axis=0) 等同sum(a,axis=0) ,如下轴向计算都类似 |
mean() |
算术平均数 |
std() ,var()
|
标准差和方差 |
min() ,max
|
最大值和最小值 |
ptp() |
计算max和min之差 |
argmin() ,argmax()
|
返回最大最小元素的索引 |
cumsum() |
所有元素的累积和 |
prod() | |
clip() |
将数值限制在某个范围,例如a.clip(3,5) ,小于3的变成3,大于5的变成5 |
round() |
近似,默认到整数 |
cumprod() |
所有元素的累积和 |
布尔型数组
布尔型数组会被强制转化为1,0,因此,sum常用来对数组中的true计算
另外有两个检测布尔值的方法any和all, .any()
用于检测数组中是否都是true,.all()
用于检测数组中所有值是否都为true,他们也可用于非布尔型数组,非0元素都会被当做True
排序
sort(a)
等同于a.sort()
,会改变数组的值
a.sort(axis)
:多维数组sort默认沿着最后一维排序,但他可以在任何一个轴上排序,只需要将轴编号传给sort即可
argsort()
:返回的是由小到大的索引位置,用索引进行排序,不会改变数组的值,如下
b=argsort(a)
a[b]
searchsorted(sorted_array, value)
:返回值在sorted_array中的位置,第一个必需是已排序的数组
sorted_array = linspace(0,1,5)
values = array([.1,.8,.3,.12,.5,.25])
searchsorted(sorted_array, values)
#out: array([1, 4, 2, 1, 2, 1], dtype=int64)
where
numpy.where()
是三元表达式x if condition else y
的矢量化版本,例如:
res=[(x if c else y) for x, y, c in zip(xarr, yarr, cond)]
#等同于
res=np.where(cond, xarr, yarr)
np.where的第二和第三各参数不必是数组,都可以是标量值,例如将数组中所有正值替换为2,负值替换为-2:np.where(a>0,2,-2)
where(array)
: where 函数会返回所有非零元素的索引。
a = array([0, 12, 5, 20])
where(a > 10)
#out: (array([1, 3], dtype=int64),
线性代数
numpy.linalg中有一组标准的矩阵分解运算和求行列式之类的函数
常用的numpy.linalg函数
函数 | 说明 | 函数 | 说明 |
---|---|---|---|
diag |
以一维数组的形式返回方阵的对角线元素 | dot |
矩阵乘法 |
trace |
计算对角线元素的和 | det |
计算矩阵行列式 |
eig |
计算方阵的本征值和本征向量 | inv |
计算方阵的逆 |
pinv |
计算方阵的Morre-Prnrose伪逆 | qr |
计算QR分解 |
svd |
计算奇异值分解 | solve |
解线性方程组Ax=b,其中A是方阵 |
lstsq |
计算Ax=b的最小二乘解 | A.I |
阵的逆矩阵 |
A**N |
表示矩阵N连乘 | \ | \ |
对角线
查看对角线元素:a.diagonal()
可以使用偏移来查看它的次对角线,正数表示右移,负数表示左移,例如a.diagonal(offset=1)
, a.diagonal(offset=-1)
随机数生成
部分numpy.random函数
函数 | 说明 | 函数 | 说明 |
---|---|---|---|
seed |
确定随机数生成器的种子 | permutation |
返回一个序列的随机排列或返回一个随机排列的范围 |
shuffle |
对一个序列就地随机排列 | rand |
产生均匀分布的样本值 |
randint |
从给定的上下限范围内随机选取整数 | randn |
产生正态分布(平均值为0,标准差为1)的样本值 |
binomial |
产生二项分布的样本值 | normal |
产生正态分布的样本值 |
beta |
产生beta分布的样本值 | chisquare |
产生卡方分布的样本值 |
gamma |
产生gamma分布的样本值 | uniform |
产生在[0,1)均匀分布的样本值 |
数组广播机制
当两个维度不相同的数组进行运算是,Numpy会根据两者的维度,自动将它们进行扩展然后进行计算。
对于 Numpy 来说,维度匹配当且仅当:
维度相同
有一个的维度是1
匹配会从最后一维开始进行,直到某一个的维度全部匹配为止,因此对于以下情况,Numpy 都会进行相应的匹配:
a = np.array([0,10,20,30])
a.shape = 4,1
b = np.array([0,1,2])
a + b
#out:array([[ 0, 1, 2],[10, 11, 12],[20, 21, 22],[30, 31, 32]])
choose 函数实现条件筛选
choose函数类似switch和case进行条件选择
control = np.array([[1,0,1],[2,1,0],[1,2,2]])
np.choose(control, [10, 11, 12]) #choose 将 0,1,2 对应的值映射为了 10, 11, 12,这里的 0,1,2 表示对应的下标。
#out:array([[11, 10, 11],[12, 11, 10],[11, 12, 12]])
choose 不仅仅能接受下标参数,还可以接受下标所在的位置:
i0 = np.array([[0,1,2], [3,4,5], [6,7,8]])
i2 = np.array([[20,21,22],[23,24,25],[26,27,28]])
control = np.array([[1,0,1], [2,1,0], [1,2,2]])
np.choose(control, [i0, 10, i2])
#out: array([[10, 1, 10],[23, 10, 5], [10, 27, 28]])
数组文件的输入输出
np.save('file_name',arr)
和np.load('file_name.npy')
是读写磁盘数据的两个主要函数,数据是以未压缩的原始二进制格式保存在扩展名为.npy的文件中
np.savez('file_name',arr_a,arr_b)
:可以将多个数组文件保存在一个压缩文件中
存取文件文本
np.loadtxt('file_name.txt', delimiter=',')