转:《Python数据分析与展示》
第一章 numpy入门
1 import numpy as np
引用模板用import numpy
设置别名 as np,其中np为约定俗成的别名名称
numpy的实例:
N维数组对象:ndarray
ndarray是一个多维数组对象,由两部分构成:1) 实际的数据. 2)描述这些数据的元数据(数据维度、数据类型等).
ndarray数组一般要求所有元素类型相同(同质),数组下标从 0开始
ndarray实例:
ndarray的对象属性如下:
用以下的实例来理解ndarray中的对象属性:
.ndim(秩,及轴的数量或维度的数量)实例:
1 In [4]: a=np.array([[0,1,2,3,4], 2 ...: [9,8,7,6,5]]) 3 4 In [5]: a.ndim 5 Out[5]: 2
因为[0,1,2,3,4]为秩1,[9,8,7,6,5]为秩2 ,所以a.ndim的结果为2
.shape(ndarray对象的尺度,对于矩阵,n行m列)实例:
1 In [6]: a.shape 2 Out[6]: (2, 5)
因为a为2行,5列,所以a.shape的值为(2,5)
.size(ndarray对象元素的个数,相当于.shape中n*m的值)实例:
1 In [7]: a.size 2 Out[7]: 10
因为a为2行,5列,所以a.shape的值为2*5=10
.dtype(ndarray对象的元素类型)实例:
1 In [8]: a.dtype 2 Out[8]: dtype('int32')
.itemsize(ndarray对象中每个元素的大小,以字节为单位)实例:
1 In [9]: a.itemsize 2 Out[9]: 4
ndarray的元素类型
数据类型 说明
bool 布尔类型,True 或False
intc 与 C语言中的int类型一致,一般是int32 或int64
intp 用于索引的整数,与 C语言中ssize_t一致,int32 或int64
int8 字节长度的整数,取值: [ ‐128, 127]
int16 16位长度的整数,取值: [ ‐32768, 32767]
int32 32位长度的整数,取值: [ ‐ 231 , 231 ‐1]
int64 64位长度的整数,取值: [ ‐ 263 , 263 ‐1]
数据类型 说明
uint8 8位无符号整数,取值:[0, 255]
uint16 16位无符号整数,取值:[0, 65535]
uint32 32位无符号整数,取值:[0, 232 ‐1]
uint64 32位无符号整数,取值:[0, 264 ‐1]
float16 16位半精度浮点数: 1位符号位, 5位指数,10位尾数
float32 32位半精度浮点数: 1位符号位, 8位指数,23位尾数
float64 64位半精度浮点数: 1位符号位,11位指数,52位尾数
数据类型 说明
complex64
复数类型,实部和虚部都是32位浮点数
实部(.real) + j虚部(.imag)
complex128
复数类型,实部和虚部都是64位浮点数
实部(.real) + j虚部(.imag)
非同质的ndarray对象
实例:
1 In [10]: x=np.array([[0,1,2,3,4], 2 ...: [9,8,7,6]]) 3 4 In [11]: x.shape 5 Out[11]: (2,) 6 7 In [12]: x.dtype 8 Out[12]: dtype('O') 9 10 In [13]: x 11 Out[13]: array([list([0, 1, 2, 3, 4]), list([9, 8, 7, 6])], dtype=object) 12 13 In [14]: x.itemsize 14 Out[14]: 8 15 16 In [15]: x.size 17 Out[15]: 2
因为[0,1,2,3,4]与[9,8,7,6]不对等,所以属于非同质对象。Out[13]可以看出非同质的ndarray元素为对象类型。
非同质ndarray对象无法有效发挥NumPy优势,尽量避免使用
ndarray数组的创建方法
1)从Python中的列表、元组等类型创建ndarray数组
x = np.array(list/tuple )
x = np.array(list/tuple, dtype=np.float32)
当np.array()不指定dtype时,NumPy将根据数据情况关联一个dtype类型
实例:
1 In [16]: x=np.array([0,1,2,3]) 2 3 In [17]: print(x) 4 [0 1 2 3] 5 6 In [18]: x=np.array((4,5,6,7)) 7 8 In [19]: print(x) 9 [4 5 6 7] 10 11 In [20]: x=np.array([[1,2],[9,8],(0.1,0.2)]) 12 13 In [21]: print(x) 14 [[1. 2. ] 15 [9. 8. ] 16 [0.1 0.2]]
1.ndarray数组可由列表类型创建;2.ndarray数组可由元组类型创建;3.ndarray数组可由列表和元组的混合类型创建。
2)使用NumPy中函数创建ndarray数组①
函数 说明
np.arange(n) 类似range()函数,返回ndarray类型,元素从 0 到 n ‐ 1
np.ones(shape) 根据shape生成一个全 1数组,shape是元组类型
np.zeros(shape) 根据shape生成一个全 0数组,shape是元组类型
np.full(shape,val) 根据shape生成一个数组,每个元素值都是val
np.eye(n) 创建一个正方的n*n单位矩阵,对角线为 1,其余为 0
实例:
1 In [1]: import numpy as np 2 3 In [2]: np.arange(10) 4 Out[2]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 5 6 In [3]: np.ones((3,6)) 7 Out[3]: 8 array([[1., 1., 1., 1., 1., 1.], 9 [1., 1., 1., 1., 1., 1.], 10 [1., 1., 1., 1., 1., 1.]]) 11 12 In [4]: np.zeros((3,6),dtype=np.int32) 13 Out[4]: 14 array([[0, 0, 0, 0, 0, 0], 15 [0, 0, 0, 0, 0, 0], 16 [0, 0, 0, 0, 0, 0]]) 17 18 In [5]: np.eye(5) 19 Out[5]: 20 array([[1., 0., 0., 0., 0.], 21 [0., 1., 0., 0., 0.], 22 [0., 0., 1., 0., 0.], 23 [0., 0., 0., 1., 0.], 24 [0., 0., 0., 0., 1.]]) 25 26 In [6]: x=np.ones((2,3,4)) 27 28 In [7]: print(x) 29 [[[1. 1. 1. 1.] 30 [1. 1. 1. 1.] 31 [1. 1. 1. 1.]] 32 33 [[1. 1. 1. 1.] 34 [1. 1. 1. 1.] 35 [1. 1. 1. 1.]]] 36 37 In [8]: x.shape 38 Out[8]: (2, 3, 4) 39 40 In [10]: np.full(10,4) 41 Out[10]: array([4, 4, 4, 4, 4, 4, 4, 4, 4, 4])
2)使用NumPy中函数创建ndarray数组②
函数 说明
np.ones_like(a) 根据数组a的形状生成一个全1数组
np.zeros_like(a) 根据数组a的形状生成一个全0数组
np.full_like(a,val) 根据数组a的形状生成一个数组,每个元素值都是val
1 In [12]: np.ones_like(x) 2 Out[12]: 3 array([[[1., 1., 1., 1.], 4 [1., 1., 1., 1.], 5 [1., 1., 1., 1.]], 6 7 [[1., 1., 1., 1.], 8 [1., 1., 1., 1.], 9 [1., 1., 1., 1.]]]) 10 11 In [14]: np.zeros_like(x) 12 Out[14]: 13 array([[[0., 0., 0., 0.], 14 [0., 0., 0., 0.], 15 [0., 0., 0., 0.]], 16 17 [[0., 0., 0., 0.], 18 [0., 0., 0., 0.], 19 [0., 0., 0., 0.]]]) 20 21 In [15]: np.full_like(x,6) 22 Out[15]: 23 array([[[6., 6., 6., 6.], 24 [6., 6., 6., 6.], 25 [6., 6., 6., 6.]], 26 27 [[6., 6., 6., 6.], 28 [6., 6., 6., 6.], 29 [6., 6., 6., 6.]]])
3)使用NumPy中其他函数创建ndarray数组
函数 说明
np.linspace() 根据起止数据等间距地填充数据,形成数组
np.concatenate() 将两个或多个数组合并成一个新的数组
实例:
1 In [16]: a=np.linspace(1,10,4) 2 3 In [17]: a 4 Out[17]: array([ 1., 4., 7., 10.]) 5 6 In [18]: b=np.linspace(1,10,4,endpoint=False) 7 8 In [19]: b 9 Out[19]: array([1. , 3.25, 5.5 , 7.75]) 10 11 In [20]: c=np.concatenate((a,b)) 12 13 In [21]: c 14 Out[21]: array([ 1. , 4. , 7. , 10. , 1. , 3.25, 5.5 , 7.75])
ndarray数组的维度变换
方法 说明
.reshape(shape) 不改变数组元素,返回一个shape形状的数组,原数组不变
.resize(shape) 与.reshape()功能一致,但修改原数组
.swapaxes(ax1,ax2) 将数组 n个维度中两个维度进行调换
.flatten() 对数组进行降维,返回折叠后的一维数组,原数组不变
实例:
In [23]: a=np.ones((2,3,4),dtype=np.int32) In [24]: a Out[24]: array([[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]], [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]]) In [25]: a.reshape((3,8)) Out[25]: array([[1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]]) In [26]: a Out[26]: array([[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]], [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]]) In [27]: a.resize((3,8)) In [28]: a Out[28]: array([[1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]]) In [29]: a.flatten() Out[29]: array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) In [30]: a Out[30]: array([[1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]]) In [31]: b=a.flatten() In [32]: b Out[32]: array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) In [33]: a=np.ones((2,3,4),dtype=np.int) In [34]: a Out[34]: array([[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]], [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]]) In [35]: b=a.astype(np.float) In [36]: b Out[36]: array([[[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]], [[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]]) In [37]: a=np.full((2,3,4),25,dtype=np.int32) In [38]: a Out[38]: array([[[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]], [[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]]]) In [39]: a.tolist() Out[39]: [[[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]], [[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]]]
数组的索引和切片
一维数组的索引和切片:与Python的列表类似
起始编号: 终止编号 (不含): 步长, 3元素冒号分割
实例:
In [40]: a=np.array([9,8,7,6,5]) In [41]: a[2] Out[41]: 7 In [42]: a[1:4:2] Out[42]: array([8, 6])
多维数组的索引:
每个维度一个索引值,逗号分割
实例:
In [43]: a=np.arange(24).reshape((2,3,4)) In [44]: a Out[44]: array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]) In [45]: a[1,2,3] Out[45]: 23 In [46]: a[0,1,2] Out[46]: 6 In [47]: a[-1,-2,-3] Out[47]: 17
注意:索引和切片下标都是从0开始的。
多维数组的切片:
1 In [48]: a[:,1,-3] 2 Out[48]: array([ 5, 17])
没有选取具体维度,那么可以用:表示所有维度。维度1的1行-3列的数据为5,维度2的1行-3列的数据为17,所以结果为[5,17]
1 In [49]: a[:,1:3,:] 2 Out[49]: 3 array([[[ 4, 5, 6, 7], 4 [ 8, 9, 10, 11]], 5 6 [[16, 17, 18, 19], 7 [20, 21, 22, 23]]])
此例当中,维度和列数都是没有限制的,只有中间的行数有限制。行数是以下标1开始的,也就是维度1当中的第2列开始切片,相对应的维度2当中的第2列开始切片。
1 In [50]: a[:,:,::2] 2 Out[50]: 3 array([[[ 0, 2], 4 [ 4, 6], 5 [ 8, 10]], 6 7 [[12, 14], 8 [16, 18], 9 [20, 22]]])
此例中,维度和行数都是没有限制的,而在列数中进行了限制。列数当中的起始和截止位置没有限制,但是步长设置成了2,所以得到结果如上所示。
ndarray数组的运算
NumPy一元函数
函数 说明
np.abs(x) np.fabs(x) 计算数组各元素的绝对值
np.sqrt(x) 计算数组各元素的平方根
np.square(x) 计算数组各元素的平方
np.log(x) np.log10(x) np.log2(x) 计算数组各元素的自然对数、10底对数和 2底对数
np.ceil(x) np.floor(x) 计算数组各元素的ceiling值 或 floor 值
np.rint(x) 计算数组各元素的四舍五入值
np.modf(x) 将数组各元素的小数和整数部分以两个独立数组形式返回
np.cos(x) np.cosh(x) np.sin(x) np.sinh(x) np.tan(x) np.tanh(x) 计算数组各元素的普通型和双曲型三角函数
np.exp(x) 计算数组各元素的指数值
np.sign(x) 计算数组各元素的符号值,1(+), 0, ‐1( ‐ )
实例:
1 In [51]: a=np.arange(24).reshape((2,3,4)) 2 3 In [52]: a 4 Out[52]: 5 array([[[ 0, 1, 2, 3], 6 [ 4, 5, 6, 7], 7 [ 8, 9, 10, 11]], 8 9 [[12, 13, 14, 15], 10 [16, 17, 18, 19], 11 [20, 21, 22, 23]]]) 12 13 In [53]: a.mean() 14 Out[53]: 11.5 15 16 In [54]: a=a/a.mean() 17 18 In [55]: a 19 Out[55]: 20 array([[[0. , 0.08695652, 0.17391304, 0.26086957], 21 [0.34782609, 0.43478261, 0.52173913, 0.60869565], 22 [0.69565217, 0.7826087 , 0.86956522, 0.95652174]], 23 24 [[1.04347826, 1.13043478, 1.2173913 , 1.30434783], 25 [1.39130435, 1.47826087, 1.56521739, 1.65217391], 26 [1.73913043, 1.82608696, 1.91304348, 2. ]]]) 27 28 In [56]: a=np.arange(24).reshape((2,3,4)) 29 30 In [57]: np.square(a) 31 Out[57]: 32 array([[[ 0, 1, 4, 9], 33 [ 16, 25, 36, 49], 34 [ 64, 81, 100, 121]], 35 36 [[144, 169, 196, 225], 37 [256, 289, 324, 361], 38 [400, 441, 484, 529]]], dtype=int32) 39 40 In [58]: a=np.sqrt(a) 41 42 In [59]: a 43 Out[59]: 44 array([[[0. , 1. , 1.41421356, 1.73205081], 45 [2. , 2.23606798, 2.44948974, 2.64575131], 46 [2.82842712, 3. , 3.16227766, 3.31662479]], 47 48 [[3.46410162, 3.60555128, 3.74165739, 3.87298335], 49 [4. , 4.12310563, 4.24264069, 4.35889894], 50 [4.47213595, 4.58257569, 4.69041576, 4.79583152]]]) 51 52 In [60]: np.modf(a) 53 Out[60]: 54 (array([[[0. , 0. , 0.41421356, 0.73205081], 55 [0. , 0.23606798, 0.44948974, 0.64575131], 56 [0.82842712, 0. , 0.16227766, 0.31662479]], 57 58 [[0.46410162, 0.60555128, 0.74165739, 0.87298335], 59 [0. , 0.12310563, 0.24264069, 0.35889894], 60 [0.47213595, 0.58257569, 0.69041576, 0.79583152]]]), 61 array([[[0., 1., 1., 1.], 62 [2., 2., 2., 2.], 63 [2., 3., 3., 3.]], 64 65 [[3., 3., 3., 3.], 66 [4., 4., 4., 4.], 67 [4., 4., 4., 4.]]]))
NumPy二元函数
函数 说明
+ ‐ * / ** 两个数组各元素进行对应运算
np.maximum(x,y) np.fmax() np.minimum(x,y) np.fmin() 元素级的最大值 /最小值计算
np.mod(x,y) 元素级的模运算
np.copysign(x,y) 将数组 y中各元素值的符号赋值给数组 x对应元素
> < >= <= == != 算术比较,产生布尔型数组
实例:
1 In [61]: a=np.arange(24).reshape((2,3,4)) 2 3 In [62]: b=np.sqrt(a) 4 5 In [63]: np.maximum(a,b) 6 Out[63]: 7 array([[[ 0., 1., 2., 3.], 8 [ 4., 5., 6., 7.], 9 [ 8., 9., 10., 11.]], 10 11 [[12., 13., 14., 15.], 12 [16., 17., 18., 19.], 13 [20., 21., 22., 23.]]]) 14 15 In [64]: a>b 16 Out[64]: 17 array([[[False, False, True, True], 18 [ True, True, True, True], 19 [ True, True, True, True]], 20 21 [[ True, True, True, True], 22 [ True, True, True, True], 23 [ True, True, True, True]]])
---------------------
作者:nodoself
来源:CSDN
原文:https://blog.csdn.net/nodoself/article/details/81749816
版权声明:本文为博主原创文章,转载请附上博文链接!