10.Python-Numpy总结

2019-06-19  本文已影响0人  Yuri7

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 创建一个N\times N方阵(对角线为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 计算各元素指数e^x
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) 计算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=',')

上一篇下一篇

猜你喜欢

热点阅读