大师兄的Python机器学习笔记:统计学基础之底层代码实现(二)
大师兄的Python机器学习笔记:Numpy库、Scipy库和Matplotlib库(二)
一、关于Numpy、Scipy和Matplotlib
- Numpy和Scipy库是Python中重要的科学计算库,Matplotlib是画图库,这三个库结合起来通常作为Matlab的开源解决方案。
- 他们都是开源项目,会随着Anaconda一起安装,当然也可以单独安装。
- Python还有很多机器学习库。
二、Numpy库
1. Numpy的主要功能
- 数组的计算和逻辑运算。
- 傅立叶变换(Fourier transformation)和图形处理中的应用。
- 与线性代数有关的操作。
- 实现数组并行计算。
2. Ndarray对象
- 也称为N维数组,是Numpy中最基本的数据结构。
- 用于描述相同类型的元素集合。
- ndarray中的每个元素都是相同大小的多维数组。
- 与Python中的list有相似的部分
>>>import numpy as np
>>>np_sample1 = np.array(["北京","上海","广州","深圳"])
>>>print(np_sample1) # 与list不同,ndarray不用','分隔
['北京' '上海' '广州' '深圳']
2.1 Ndarray对象组成结构
- 一个指向数据的指针。
- 数据类型或dtype,也就是若干个固定大小的数据结构。
- shape:一个表示数组结构的元祖。
- stride: 跨度元祖,表示每个元素的字节数。
2.2 Ndarray对象的参数
- numpy.array(object,dtype=None,copy=True,order=None,subok=False,ndmin=0)
参数 含义 object 数组或嵌套的数列 dtype 数组元素的数据类型,可选 copy 对象是否需要复制,可选 order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认) subok 默认返回一个与基类类型一致的数组 ndmin 指定生成数组的最小维度 # 二维数组 >>>np_sample2 = np.array([["北京",1],["上海",2],["广州",3],["深圳",4]],ndmin=2) >>>print(np_sample2) [['北京' '1'] ['上海' '2'] ['广州' '3'] ['深圳' '4']]
2.3 dtype数据类型
- numpy支持的数据类型比Python多,包括:
数据类型 描述 bool_ 存储为一个字节的布尔值(真或假) int_ 默认整数,相当于 C 的long,通常为int32或int64 intc 相当于 C 的int,通常为int32或int64 intp 用于索引的整数,相当于 C 的size_t,通常为int32或int64 int8 字节(-128 ~ 127) int16 16 位整数(-32768 ~ 32767) int32 32 位整数(-2147483648 ~ 2147483647) int64 64 位整数(-9223372036854775808 ~ 9223372036854775807) uint8 8 位无符号整数(0 ~ 255) uint16 16 位无符号整数(0 ~ 65535) uint32 32 位无符号整数(0 ~ 4294967295) uint64 64 位无符号整数(0 ~ 18446744073709551615) float_ float64的简写 float16 半精度浮点:符号位,5 位指数,10 位尾数 float32 单精度浮点:符号位,8 位指数,23 位尾数 float64 双精度浮点:符号位,11 位指数,52 位尾数 complex_ complex128的简写 complex64 复数,由两个 32 位浮点表示(实部和虚部) complex128 复数,由两个 64 位浮点表示(实部和虚部) # 指定数据类型 >>>np_sample2 = np.array([1,2,3,4,5],dtype='float64') >>>print(np_sample2) [1. 2. 3. 4. 5.]
2.4 ndarray.shape数组结构
- 返回数组维度的元祖。
- 可以用来调整数组大小。
>>>import numpy as np >>>n = np.array([['北京',1],['上海',2],['广州',3],['深圳',4]]) # 返回数组的大小 >>>print(n.shape) (4, 2) >>>n.shape = (1,8) # 调整数据大小 >>>print(n) [['北京' '1' '上海' '2' '广州' '3' '深圳' '4']]
2.5 ndarray.ndim数组维数
- 返回数组的维数。
>>>import numpy as np >>>n = np.array([['北京',1],['上海',2],['广州',3],['深圳',4]]) >>>print(n.ndim) 2
2.6 ndarray.reshape()重构数组
- 返回一个重构的新数组。
>>>import numpy as np >>>n1 = np.array([['北京',1],['上海',2],['广州',3],['深圳',4]]) >>>n2 = n1.reshape(2,2,2) >>>print(n2) [[['北京' '1'] ['上海' '2']] [['广州' '3'] ['深圳' '4']]]
2.7 numpy.itemsize
- 返回数组中每个元素的字节单位长度。
>>>import numpy as np >>>n = np.array([['北京',1],['上海',2],['广州',3],['深圳',4]],dtype='str') >>>print(n.itemsize) # 每个元素8个字节 8
2.8 numpy.flags
- 返回ndarray的当前属性。
- 这些属性包括:
属性 描述 C_CONTIGUOUS (C) 数组位于单一的、C 风格的连续区段内 F_CONTIGUOUS (F) 数组位于单一的、Fortran 风格的连续区段内 OWNDATA (O) 数组的内存从其它对象处借用 WRITEABLE (W) 数据区域可写入。 将它设置为flase会锁定数据,使其只读 ALIGNED (A) 数据和任何元素会为硬件适当对齐 UPDATEIFCOPY (U) 这个数组是另一数组的副本。当这个数组释放时,源数组会由这个数组中的元素更新 >>>import numpy as np >>>n = np.array([['北京',1],['上海',2],['广州',3],['深圳',4]],dtype=str) >>>print(n.flags) C_CONTIGUOUS : True F_CONTIGUOUS : False OWNDATA : True WRITEABLE : True ALIGNED : True WRITEBACKIFCOPY : False UPDATEIFCOPY : False
3. 创建新数组
- 可以通过以下任意方法创建数组。
3.1 numpy.empty(<shape>,<Dtype>,<Order>)
- 创建一个未初始化的数组。
- 元素为随机值。
- 属性包括:
参数 描述 Shape 空数组的形状,整数或整数元组 Dtype 所需的输出数组类型 Order 'C'为按行的 C 风格数组,'F'为按列的 Fortran 风格数组 >>>import numpy as np >>>n = np.empty([4,6],'int64','C') >>>print(n) [[ 836 836 856 856 984 984] [ 988 988 596 596 1036 1036] [1292 1292 1300 1300 1116 1116] [1312 1312 1128 1128 1328 1328]]
3.2 numpy.zeros(<shape>,<dtype>)
- 创建一个数组,并用0作为初始元素。
>>>import numpy as np >>>n = np.zeros([4,6]) >>>print(n) [[0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0.]]
3.3 numpy.ones(<shape>,<dtype>,<order>)
- 创建一个新数组,并用1作为初始元素。
>>>import numpy as np >>>n = np.ones([3,5],int,"F") >>>print(n) [[1 1 1 1 1] [1 1 1 1 1] [1 1 1 1 1]]
4. 通过数据创建新数组
- 将现有的Python数据类型转换为N数组。
4.1 numpy.asarray(<a>,<dtype>,<order>)
- 将任意输入数组参数<a>转换为N数组。
>>>import numpy as np >>>n1 = np.asarray(['a','b','c']) # list() >>>print(n1) ['a' 'b' 'c'] >>>n2 = np.asarray((1,2,3),int,'C') # tuple() >>>print(n2) [1 2 3] >>>n3 = np.asarray([(1,2,3),(4,5,6),[7,8,9]]) # 数组结构 >>>print(n3) [[1 2 3] [4 5 6] [7 8 9]]
4.2 numpy.frombuffer(<buffer>,<dtype>,<count>,<offset>)
- 将缓冲区对象转换为N数组。
- 参数解释:
参数 描述 buffer 任何暴露缓冲区借口的对象 dtype 返回数组的数据类型,默认为float count 需要读取的数据数量,默认为-1,读取所有数据 offset 需要读取的起始位置,默认为0 >>>import numpy as np >>>s = b'123 456 789' >>>a = np.frombuffer(s, dtype = 'S1') >>>print(a) [b'1' b'2' b'3' b' ' b'4' b'5' b'6' b' ' b'7' b'8' b'9']
4.3 numpy.fromiter(<iterable>,<dtype>,<count>)
- 从任何可迭代对象构建N数组。
>>>import numpy as np >>>l = (n for n in range(20)) # 可迭代生成器 >>>n = np.fromiter(l,'int32') >>>print(n) [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
5. 通过数值范围创建新数组
5.1 numpy.arange(<start>,<stop>,<step>,<dytype>)
- 根据给定的范围和间隔值生成N数组。
- 参数含义:
序号 参数及描述 start 范围的起始值,默认为0 stop 范围的终止值(不包含) step 两个值的间隔(步长),默认为1 dtype 返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。 >>>import numpy as np >>>n = np.arange(10,100,10,"int64") >>>print(n) [10 20 30 40 50 60 70 80 90]
5.2 numpy.linspace(<start>,<stop>,<num>,<endpoint>,<retstep>,<dtype>)
- 通过固定范围内,元素的均匀数量生成N数组。
- 参数含义:
序号 参数及描述 start 序列的起始值 stop 序列的终止值,如果endpoint为true,该值包含于序列中 num 要生成的等间隔样例数量,默认为50 endpoint 序列中是否包含stop值,默认为ture retstep 如果为true,返回样例,以及连续数字之间的步长 dtype 输出ndarray的数据类型 >>>import numpy as np >>>n = np.linspace(10,100,25,False,True) >>>print(n) (array([10. , 13.6, 17.2, 20.8, 24.4, 28. , 31.6, 35.2, 38.8, 42.4, 46. , 49.6, 53.2, 56.8, 60.4, 64. , 67.6, 71.2, 74.8, 78.4, 82. , 85.6, 89.2, 92.8, 96.4]), 3.6)
5.3 numpy.logspace(<start>,<stop>,<num>,<endpoint>,<base>,<dtype>)
- 通过在两个固定底数幂的范围内,元素的均匀数量生成N数组。
- 参数含义:
序号 参数及描述 start 起始值是base ** start stop 终止值是base ** stop num 范围内的数值数量,默认为50 endpoint 如果为true,终止值包含在输出数组当中 base 对数空间的底数,默认为10 dtype 输出数组的数据类型,如果没有提供,则取决于其它参数 >>>import numpy as np >>>n = np.logspace(start=1,stop=10,num=20,base=2) >>>print(n) [ 2. 2.77730229 3.85670399 5.3556164 7.43708284 10.32751358 14.34131354 19.91508143 27.65510059 38.40328703 53.32876841 74.05505519 102.836637 142.80421347 198.30523421 275.37679007 382.40229418 531.02338276 737.40622722 1024. ]
6. N数组的访问和修改。
6.1 通过切片访问和修改
- 可以像list一样切片。
- 也可以通过slice(<start>,<stop>,<step>)获取数组的一部分。
>>>import numpy as np >>>n = np.arange(1,10,1) >>>s1 = n[4] >>>print(s1) 5 >>>s2 = slice(2,8,2) >>>print(n[s2]) array([3, 5, 7])
6.2 通过索引访问和修改
- 可以像list一样通过索引访问。
>>>s1 = n[2:8:3] >>>print(s1) [3 6] >>>s2 = n[2:] >>>print(s2) [3 4 5 6 7 8 9]
6.3 高级索引
- 如果是非元祖序列, 数据类型为整数或布尔值,或包含序列,就可以使用高级序列。
- 有两种高级序列:整数和布尔值。
1)整数索引
- 从多维数组的索引,行号和下标返回N数组。
>>>import numpy as np >>>x = np.asarray([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]) # 通过行号和下标 >>>y = x[[0,1,2],[0,1,2]] >>>print(y) [ 1 7 13] # 通过索引和下标返回 >>>z = x[1:3,[1,4]] >>>print(z) [[ 7 10] [12 15]]
2)布尔索引
- 可以用布尔运算的方式索引N数组。
# 通过布尔运算值过滤N数组 >>>import numpy as np >>>n = np.asarray([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]) >>>print(n[n<7]) [1 2 3 4 5 6]
- np.nan在N数组中表示空值。
# 过滤np.nan >>>import numpy as np >>>a = np.array([np.nan, 1,2,np.nan,3,4,5]) >>>print(a[~np.isnan(a)]) # ~在数位运算中表示逐位取反0->1, 1->0 [1. 2. 3. 4. 5.]
- 通过判断元素类型索引N数组。
# 获得N数组中复数的元素 >>>import numpy as np >>>n = np.asarray([[1,2,3,8+5j,5],[6,7,5+2j,9,10],[11,1+9j,13,14,15]]) >>>print(n[np.iscomplex(n)]) [8.+5.j 5.+2.j 1.+9.j]
7. N数组的广播和迭代。
7.1 N数组的广播
- 广播指的是N数组处理不同形状数组的能力。
1) 两个形状相同的数组处理
- 如果两个数组相同,则无缝对等处理。
>>>import numpy as np >>>l1 = np.asarray([1,2,3,4,5]) >>>l2 = np.asarray([2,4,6,8,10]) >>>l3 = l1*l2 >>>print(l3) [ 2 8 18 32 50]
2) 两个维度不同的数组处理
- 如果两个数组维度不同,但较小维度的数组长度为1,则将较小的数组对应较大数组的每个元素处理。
>>>import numpy as np >>>l1 = np.asarray([[1,2,3,4,5],[10,11,12,13,14],[20,21,22,23,24]]) >>>l2 = np.asarray([2,4,6,8,10]) >>>l3 = l1*l2 >>>print(l3) [[ 2 8 18 32 50] [ 20 44 72 104 140] [ 40 84 132 184 240]] # 更极端的例子 >>>import numpy as np >>>l1 = np.asarray([[[1,2,3,4,5],[10,11,12,13,14],[20,21,22,23,24]],[[1,2,3,4,5],[10,11,12,13,14],[20,21,22,23,24]]]) >>>l2 = np.asarray(4) >>>l3 = l1*l2 >>>print(l3) [[[ 4 8 12 16 20] [40 44 48 52 56] [80 84 88 92 96]] [[ 4 8 12 16 20] [40 44 48 52 56] [80 84 88 92 96]]]
7.2 N数组的迭代
1) N数组的内置迭代器: numpy.nditer()
- 与Iterator迭代器类似。
- 可以实现多维数组的迭代。
>>>import numpy as np >>>n = np.asarray([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]) >>>l = list() >>>for x in np.nditer(n): >>> l.append(x) >>>print(l) [array(1), array(2), array(3), array(4), array(5), array(6), array(7), array(8), array(9), array(10), array(11), array(12), array(13), array(14), array(15)]
2) 迭代顺序
- 可以通过参数<order>强制迭代顺序:
- 'C'风格:C语言格式。例:1,2,3,4,5,6,7,8,9
- 'F'风格:Fortran语言格式。例:1,4,7,2,5,8,3,6,9
>>>import numpy as np >>>n = np.arange(0,100,5) >>>n = n.reshape(2,2,5) >>>l = list() >>>for x in np.nditer(n,order='C'): >>> l.append(x) >>>print(l) [array(0), array(5), array(10), array(15), array(20), array(25), array(30), array(35), array(40), array(45), array(50), array(55), array(60), array(65), array(70), array(75), array(80), array(85), array(90), array(95)] >>>l = list() >>>for x in np.nditer(n,order='F'): >>> l.append(x) >>>print(l) [array(0), array(50), array(25), array(75), array(5), array(55), array(30), array(80), array(10), array(60), array(35), array(85), array(15), array(65), array(40), array(90), array(20), array(70), array(45), array(95)]
3) 迭代并修改参数值
- 通过修改参数<op_flags=['read']>为['readwrite']可以允许数组在迭代时被修改。
>>>import numpy as np >>>n = np.arange(0,10,2) >>>for x in np.nditer(n,op_flags=['readwrite']): >>> x += 1 >>>print(n) [1 3 5 7 9]
4) 迭代返回多个值的一堆数组
- 可以通过参数<flags=['external_loop']>实现功能。
>>>import numpy as np >>>n = np.arange(0,20,2) >>>n = n.reshape(2,5) >>>m = [x for x in np.nditer(n,flags=['external_loop'],order='F')] >>>print(m) [array([ 0, 10]), array([ 2, 12]), array([ 4, 14]), array([ 6, 16]), array([ 8, 18])]
5) 广播迭代
- 如果两个数组可广播,则他们可以同时被迭代。
>>>import numpy as np >>>a = np.arange(0,20,2) >>>b = np.arange(20,40,2) >>>a = a.reshape(2,5) >>>b = b.reshape(2,5) >>>for a,b, in np.nditer([a,b]): >>> print(a+b) 20 24 28 32 36 40 44 48 52 56
8. N数组的数组操作。
8.1 变形操作
1) numpy.reshape
- 重组数据形状。
>>>import numpy as np >>>n = np.arange(0,20,2) >>>m = n.reshape(2,5) >>>print(m) [[ 0 2 4 6 8] [10 12 14 16 18]]
2) numpy.ndarray.flat
- 返回数组的一维迭代器。
>>>import numpy as np >>>n = np.arange(0,20,2) >>>m = n.reshape(2,5) >>>print(m.flat) <numpy.flatiter object at 0x000001B70608C7D0>
3) numpy.ndarray.flatten(<order>)
- 将数组折叠为一维数组,并返回一份复制。
- <order>顺序包括:
顺序 含义 'C' 行 'F' 列 'A' 原顺序 'K' 元素在内存中的顺序 >>>import numpy as np >>>n = np.asarray([[[1,2,3,4,5],[10,11,12,13,14],[20,21,22,23,24]],[[1,2,3,4,5],[10,11,12,13,14],[20,21,22,23,24]]]) >>>m = n.flatten('C') >>>print(m) [ 1 2 3 4 5 10 11 12 13 14 20 21 22 23 24 1 2 3 4 5 10 11 12 13 14 20 21 22 23 24]
4) numpy.ravel(<ndarray>,<order>)
- 与flattern类似,将数组折叠为一维数组,但返回的是视图。
>>>import numpy as np >>>n = np.asarray([[[1,2,3,4,5],[10,11,12,13,14],[20,21,22,23,24]],[[1,2,3,4,5],[10,11,12,13,14],[20,21,22,23,24]]]) >>>np.ravel(m,'C') array([ 1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24, 1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24])
8.2 翻转操作
1) numpy.transpose(<arr>,<axes=0>)
- 将N数组<arr>翻转。
- <axes>表示坐标方向。
>>>import numpy as np >>>n = np.arange(0,20).reshape(2,5,2) >>>print(n) # 翻转前 [[[ 0 1] [ 2 3] [ 4 5] [ 6 7] [ 8 9]] [[10 11] [12 13] [14 15] [16 17] [18 19]]] >>>np.transpose(n) # 翻转后 array([[[ 0, 10], [ 2, 12], [ 4, 14], [ 6, 16], [ 8, 18]], [[ 1, 11], [ 3, 13], [ 5, 15], [ 7, 17], [ 9, 19]]])
2) numpy.ndarray.T
- 简单翻转,相当于numpy.transpose(<arr>,<axes=0>)。
>>>import numpy as np >>>n = np.arange(0,20).reshape(2,5,2) >>>print(n) # 翻转前 [[[ 0 1] [ 2 3] [ 4 5] [ 6 7] [ 8 9]] [[10 11] [12 13] [14 15] [16 17] [18 19]]] >>>n.T # 翻转后 array([[[ 0, 10], [ 2, 12], [ 4, 14], [ 6, 16], [ 8, 18]], [[ 1, 11], [ 3, 13], [ 5, 15], [ 7, 17], [ 9, 19]]])
3) numpy.rollaxis(<arr>,<axis>,<start=0>)
- 将N数组<arr>的下标滚动到特定位置。
- <axis>表示要滚动的轴,其他轴的位置不会变。
- <start>表示开始滚动的位置。
>>>import numpy as np >>>n = np.arange(0,8).reshape(2,2,2) >>>print(n) # 滚动之前 [[[0 1] [2 3]] [[4 5] [6 7]]] >>>np.rollaxis(n,1,0) # 滚动后 array([[[0, 1], [4, 5]], [[2, 3], [6, 7]]])
4) numpy.swapaxes(<arr>,<axis1>,<axis2>)
- 将N数组<arr>的<axis1>轴和<axis2>轴交换。
>>>import numpy as np >>>n = np.arange(0,8).reshape(2,2,2) >>>print(n) # 交换前 [[[0 1] [2 3]] [[4 5] [6 7]]] >>>np.swapaxes(n,1,2) # 交换后 array([[[0, 2], [1, 3]], [[4, 6], [5, 7]]])
8.3 修改维度
1) numpy.broadcast(<arr1>,<arr2>)
- 返回一个数组<arr1>广播到另一个数组<arr2>的结果。
>>>import numpy as np >>>n1 = np.arange(0,8).reshape(8,1) >>>n2 = np.arange(10,20,2) >>>n3 = np.broadcast(n1,n2) >>>print(list(n3)) [(0, 10), (0, 12), (0, 14), (0, 16), (0, 18), (1, 10), (1, 12), (1, 14), (1, 16), (1, 18), (2, 10), (2, 12), (2, 14), (2, 16), (2, 18), (3, 10), (3, 12), (3, 14), (3, 16), (3, 18), (4, 10), (4, 12), (4, 14), (4, 16), (4, 18), (5, 10), (5, 12), (5, 14), (5, 16), (5, 18), (6, 10), (6, 12), (6, 14), (6, 16), (6, 18), (7, 10), (7, 12), (7, 14), (7, 16), (7, 18)]
2) numpy.broadcast_to(<arr>,<shape>,<subok=False>)
- 将N数组<arr>广播为新的形状<shape>
- 如果<subok>为True,则与基类类型一致。
>>>import numpy as np >>>n = np.arange(0,8).reshape(8,1) >>>np.broadcast_to(n,(8,3)) array([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3], [4, 4, 4], [5, 5, 5], [6, 6, 6], [7, 7, 7]])
3) numpy.expand_dims(<arr>,<axis>)
- 在N数组<arr>中的指定维度<axis>增加新的轴来扩展数组的维度。
>>>import numpy as np >>>n = np.arange(0,8).reshape(4,2) >>>print(n) [[0 1] [2 3] [4 5] [6 7]] >>>np.expand_dims(n,1) array([[[0, 1]], [[2, 3]], [[4, 5]], [[6, 7]]])
4) numpy.squeeze(<arr>,<axis>)
- 从N数组<arr>的删除指定维度<axis>。
>>>import numpy as np >>>n = np.arange(0,8).reshape(1,2,4) >>>print(n) # 删除前 [[[0 1 2 3] [4 5 6 7]]] >>>np.squeeze(n) # 删除后 array([[0, 1, 2, 3], [4, 5, 6, 7]])
8.4 连接数组
1) numpy.concatenate((<arr1>,<arr2>...),<axis>)
- 沿指定轴<axis>连接n个数组。
>>>import numpy as np >>>n1 = np.arange(0,8).reshape(2,4) >>>n2 = np.arange(9,13).reshape(2,2) >>>print(n1) [[0 1 2 3] [4 5 6 7]] >>>print(n2) [[ 9 10] [11 12]] >>>n3 = np.concatenate((n1,n2),1) >>>print(n3) [[ 0 1 2 3 9 10] [ 4 5 6 7 11 12]]
2) numpy.stack((<arr1>,<arr2>...),<axis>)
- 沿指定的轴增加新的数组。
- 所有的N数组必须是相同的形状。
>>>import numpy as np >>>n1 = np.arange(0,8).reshape(2,4) >>>n2 = np.arange(9,17).reshape(2,4) >>>print(n1) [[0 1 2 3] [4 5 6 7]] >>>print(n2) [[ 9 10 11 12] [13 14 15 16]] >>>n3 = np.stack((n1,n2),0) >>>print(n3) [[[ 0 1 2 3] [ 4 5 6 7]] [[ 9 10 11 12] [13 14 15 16]]]
3) numpy.hstack((<arr1>,<arr2>...),<axis>)
- 与numpy.stack()相同,但堆叠方向固定为水平方向。
>>>import numpy as np >>>n1 = np.arange(0,8).reshape(2,4) >>>n2 = np.arange(9,17).reshape(2,4) >>>print(n1) [[0 1 2 3] [4 5 6 7]] >>>print(n2) [[ 9 10 11 12] [13 14 15 16]] >>>n3 = np.hstack((n1,n2)) >>>print(n3) [[ 0 1 2 3 9 10 11 12] [ 4 5 6 7 13 14 15 16]]
4) numpy.vstack((<arr1>,<arr2>...),<axis>)
- 与numpy.stack()相同,但堆叠方向固定为垂直方向。
>>>import numpy as np >>>n1 = np.arange(0,8).reshape(2,4) >>>n2 = np.arange(9,17).reshape(2,4) >>>print(n1) [[0 1 2 3] [4 5 6 7]] >>>print(n2) [[ 9 10 11 12] [13 14 15 16]] >>>n3 = np.vstack((n1,n2)) >>>print(n3) [[ 0 1 2 3] [ 4 5 6 7] [ 9 10 11 12] [13 14 15 16]]
8.5 分割数组
1) numpy.split(<arr>,<indices>,<axis=0>)
- 将N数组<arr>沿指定轴<axis>分割成<indices>个数组。
>>>import numpy as np >>>n = np.arange(0,8).reshape(2,2,2) >>>print(n) [[[0 1] [2 3]] [[4 5] [6 7]]] >>>n1,n2 = np.split(n,2,0) >>>print(n1) [[[0 1] [2 3]]] >>>print(n2) [[[4 5] [6 7]]]
2) numpy.hsplit(<arr>,<indices>)
- 与numpy.split()相同,但是固定在水平方向分割。
>>>import numpy as np >>>n = np.arange(0,8).reshape(2,2,2) >>>print(n) [[[0 1] [2 3]] [[4 5] [6 7]]] >>>n1,n2 = np.hsplit(n,2) >>>print(n1) [[[0 1]] [[4 5]]] >>>print(n2) [[[2 3]] [[6 7]]]
3) numpy.vsplit(<arr>,<indices>)
- 与numpy.split()相同,但是固定在垂直方向分割。
>>>import numpy as np >>>n = np.arange(0,8).reshape(2,2,2) >>>print(n) [[[0 1] [2 3]] [[4 5] [6 7]]] >>>n1,n2 = np.vsplit(n,2) >>>print(n1) [[[0 1] [2 3]]] >>>print(n2) [[[4 5] [6 7]]]
8.6 元素操作
1) numpy.resize(<arr>,<shape>)
- 返回指定形状的新数组。
>>>import numpy as np >>>n1 = np.arange(0,8) >>>print(n1) [0 1 2 3 4 5 6 7] >>>n2 = np.resize(n1,(2,4)) >>>print(n2) [[0 1 2 3] [4 5 6 7]]
2) numpy.append(<arr>,<values>,<axis=0>)
- 在N数组<arr>的尾部增加值<values>。
- <values>的维度必须与现有数组一致。
- <axis>操作的轴。
>>>import numpy as np >>>n = np.arange(0,8).reshape(2,4) >>>print(n) [[0 1 2 3] [4 5 6 7]] >>>np.append(n,[[9,9,9,9],[9,9,9,9]],1) array([[0, 1, 2, 3, 9, 9, 9, 9], [4, 5, 6, 7, 9, 9, 9, 9]])
3) numpy.insert(<arr>,<obj>,<values>,<axis=0>)
- 在N数组<arr>的某个值<obj>前增加值<values>。
- <values>的维度必须与现有数组一致。
- <axis>操作的轴。
>>>import numpy as np >>>n = np.arange(0,8).reshape(2,4) >>>print(n) [[0 1 2 3] [4 5 6 7]] >>>np.insert(n,1,[[9,9,9,9]],0) array([[0, 1, 2, 3], [9, 9, 9, 9], [4, 5, 6, 7]])
4) numpy.delete(<arr>,<obj>,<axis=0>)
- 从N数组中沿<axis>轴删除值<obj>。
>>>import numpy as np >>>n = np.arange(0,8).reshape(2,4) >>>print(n) [[0 1 2 3] [4 5 6 7]] >>>np.delete(n,1,0) array([[0, 1, 2, 3]])
5) numpy.unique(<arr>,<return_index>,<return_inverse>,<return_counts>)
- N数组去重。
- <return_index = True> 则返回输入数组的元素下标
- <return_inverse = True> 则返回去重数组的元素下标
- <return_counts = True> 则返回元素的去重次数
>>>import numpy as np >>>n = np.asarray([[1,2,3,4,5,6,7],[2,3,4,5,6,7,8],[3,4,5,6,7,8,9]]) >>>print(n) [[1 2 3 4 5 6 7] [2 3 4 5 6 7 8] [3 4 5 6 7 8 9]] >>>np.unique(n,True,True,True) (array([1, 2, 3, 4, 5, 6, 7, 8, 9]), array([ 0, 1, 2, 3, 4, 5, 6, 13, 20], dtype=int64), array([0, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 8], dtype=int64), array([1, 2, 3, 3, 3, 3, 3, 2, 1], dtype=int64))
8.7 位操作
- 位操作是指数字的二进制位操作。
1) numpy.bitwise_and(<arr1>,<arr2)
- 对两个数组中的数字进行与(and)运算。
>>>import numpy as np >>>n1 = np.arange(1,10) >>>print([bin(x) for x in n1]) ['0b1', '0b10', '0b11', '0b100', '0b101', '0b110', '0b111', '0b1000', '0b1001'] >>>n2 = np.arange(11,20) >>>print([bin(x) for x in n2]) ['0b1011', '0b1100', '0b1101', '0b1110', '0b1111', '0b10000', '0b10001', '0b10010', '0b10011'] >>>n3 = np.bitwise_and(n1,n2) >>>print([bin(x) for x in n3]) ['0b1', '0b0', '0b1', '0b100', '0b101', '0b0', '0b1', '0b0', '0b1']
2) numpy.bitwise_or(<arr1>,<arr2>)
- 对两个数组中的数字进行或(or)运算。
>>>import numpy as np >>>n1 = np.arange(1,10) >>>print([bin(x) for x in n1]) ['0b1', '0b10', '0b11', '0b100', '0b101', '0b110', '0b111', '0b1000', '0b1001'] >>>n2 = np.arange(11,20) >>>print([bin(x) for x in n2]) ['0b1011', '0b1100', '0b1101', '0b1110', '0b1111', '0b10000', '0b10001', '0b10010', '0b10011'] >>>n3 = np.bitwise_or(n1,n2) >>>print([bin(x) for x in n3]) ['0b1011', '0b1110', '0b1111', '0b1110', '0b1111', '0b10110', '0b10111', '0b11010', '0b11011']
3) invert(<arr>)
- 对数组中的数字进行位非操作(!)。
- 返回补码。
>>>import numpy as np >>>n1 = np.arange(1,10) >>>print([np.binary_repr(x) for x in n1]) ['1', '10', '11', '100', '101', '110', '111', '1000', '1001'] >>>n2 = np.invert(n1) >>>print([np.binary_repr(x) for x in n2]) ['-10', '-11', '-100', '-101', '-110', '-111', '-1000', '-1001', '-1010']
4)left_shift(<arr>,<n>)
- 将数组<arr>中的数字左位移<n>个位置,并补0。
>>>import numpy as np >>>n1 = np.arange(1,10) >>>print([np.binary_repr(x) for x in n1]) ['1', '10', '11', '100', '101', '110', '111', '1000', '1001'] >>>n2 = np.left_shift(n1,2) >>>print([np.binary_repr(x) for x in n2]) ['100', '1000', '1100', '10000', '10100', '11000', '11100', '100000', '100100']
5) right_shift(<arr>,<n>)
- 将数组<arr>中的数字右位移<n>个位置,并补0。
>>>import numpy as np >>>n1 = np.arange(1,10) >>>print([np.binary_repr(x) for x in n1]) ['1', '10', '11', '100', '101', '110', '111', '1000', '1001'] >>>n2 = np.right_shift(n1,2) >>>print([np.binary_repr(x) for x in n2]) ['0', '0', '0', '1', '1', '1', '1', '10', '10']
8.8 字符串操作
1) numpy.char.add(<arr1>,<arr2>)
- 将两个列表中的字符串拼接。
>>>import numpy as np >>>n1 = np.array(["a","b","c","d"]) >>>n2 = np.array(["A","B","C","D"]) >>>n3 = np.char.add(n1,n2) >>>print(n3) ['aA' 'bB' 'cC' 'dD']
2) numpy.char.multiply(<arr>,<n>)
- 将列表中的字符串进行<n>重拼接。
>>>import numpy as np >>>n1 = np.array(["a","b","c","d"]) >>>n2 = np.char.multiply(n1,5) >>>print(n2) ['aaaaa' 'bbbbb' 'ccccc' 'ddddd']
3) numpy.char.center(<arr>, <width>,<fillchar>)
- 将数组<arr>统一至 <width>长度并居中。
- 如果位数不足则用<fillchar>填充。
>>>import numpy as np >>>n1 = np.array(["abcd","abc","ab","a"]) >>>n2 = np.char.center(n1,3,'#') >>>>print(n2) ['abc' 'abc' '#ab' '#a#']
4) numpy.char.capitalize(<arr>)
- 将数组中的字符串首字母大写。
>>>import numpy as np >>>n1 = np.array(["abcd","abc","ab","a"]) >>>>n2 = np.char.capitalize(n1) >>>>print(n2) ['Abcd' 'Abc' 'Ab' 'A']
5) numpy.char.capitalize(<arr>)
- 将数组中的每个首字母大写。
>>>import numpy as np >>>n1 = np.array(["abcd","abc","ab","a"]) >>>n2 = np.char.title(n1) >>>print(n2) ['Abcd' 'Abc' 'Ab' 'A']
6) numpy.char.lower(<arr>)
- 将数组中的所有字母小写。
>>>import numpy as np >>>n1 = np.array(["ABCD","ABC","AB","A"]) >>>n2 = np.char.lower(n1) >>>print(n2) ['abcd' 'abc' 'ab' 'a']
7) numpy.char.upper(<arr>)
- 将数组中的所有字母大写。
>>>import numpy as np >>>n1 = np.array(['abcd' 'abc' 'ab' 'a']) >>>n2 = np.char.lower(n1) >>>print(n2) ["ABCD","ABC","AB","A"]
8) numpy.char.split(<arr>,<sep>)
- 将数组中的字符串以<sep>分割。
>>>import numpy as np >>>n1 = np.array(["abcd","abc","ab","a"]) >>>n2 = np.char.split(n1,'b') >>>print(n2) [list(['a', 'cd']) list(['a', 'c']) list(['a', '']) list(['a'])]
9) numpy.char.splitlines(<arr>)
- 将数组中的字符串以换行符分割。
>>>import numpy as np >>>n1 = np.array(["Hello\nWorld!","Hello World!","Learn\nPython","Learn Python\n"]) >>>n2 = np.char.splitlines(n1) >>>print(n2) [list(['Hello', 'World!']) list(['Hello World!']) list(['Learn', 'Python']) list(['Learn Python'])]
10) numpy.char.strip(<arr>,<char>)
- 移除数组中字符串头或尾的<char>值。
>>>import numpy as np >>>n1 = np.array(["a","ab","ba","abab"]) >>>n2 = np.char.strip(n1,'a') >>>print(n2) ['' 'b' 'b' 'bab']
11) numpy.char.join(<char>,<arr>)
- 将数字中的单个字符串以<char>相连。
>>>import numpy as np >>>n1 = np.array(["a","ab","ba","abab"]) >>>n2 = np.char.join('-',n1) >>>print(n2) ['a' 'a-b' 'b-a' 'a-b-a-b']
12) numpy.char.replace(<arr>,<char>,<replace_char)
- 将数组中字符串的<char>字符替换为<replace_char>。
>>>import numpy as np >>>n1 = np.array(["a","ab","ba","abab"]) >>>n2 = np.char.replace(n1,'b','z') >>>print(n2) ['a' 'az' 'za' 'azaz']
13) numpy.char.decode(<arr>,<code>)
- 将数组中的元素按照<code>解码。
>>>import numpy as np >>>n1 = np.array([b"a",b"b",b"c",b"d",b"e"]) >>>n2 = np.char.decode(n1,"UTF8") >>>print(n2) ['a' 'b' 'c' 'd' 'e']
14) numpy.char.encode(<arr>,<code>)
- 将数组中的元素按照<code>编码。
>>>import numpy as np >>>n1 = np.array(["a","b","c","d","e"]) >>>n2 = np.char.encode(n1,"UTF8") >>>print(n2) [b'a' b'b' b'c' b'd' b'e']
8.9 算数函数
1) numpy.degrees(<radian>)
- 将弧度转为角度。
>>>import numpy as np >>>angle = np.array([0,30,45,60,90]) >>>np.degrees(np.sin(angle*np.pi/180)) array([ 0. , 28.64788976, 40.51423423, 49.61960059, 57.29577951])
2) 三角函数
- 计算数组中元素的三角函数值。
函数 说明 numpy.sin() 正弦函数 numpy.cos() 余弦函数 numpy.tan() 正切函数 numpy.arcsin() 正弦反三角函数 numpy.arccos() 余弦反三角函数 numpy.arctan() 正切反三角函数 >>>import numpy as np >>>angle = np.array([0,30,45,60,90]) >>>sin = np.sin(angle*np.pi/180) >>>print(sin) [0. 0.5 0.70710678 0.8660254 1. ] >>>cos = np.cos(angle*np.pi/180) >>>print(cos) [1.00000000e+00 8.66025404e-01 7.07106781e-01 5.00000000e-01 6.12323400e-17] >>>tan = np.tan(angle*np.pi/180) >>>print(tan) [0.00000000e+00 5.77350269e-01 1.00000000e+00 1.73205081e+00 1.63312394e+16] >>>arcsin = np.arcsin(sin) >>>print(arcsin) [0. 0.52359878 0.78539816 1.04719755 1.57079633] >>>arccos = np.arccos(cos) >>>print(arccos) [0. 0.52359878 0.78539816 1.04719755 1.57079633] >>>arctan = np.arctan(tan) >>>print(arctan) [0. 0.52359878 0.78539816 1.04719755 1.57079633]
3) 舍入函数
- 处理数组中浮点数元素的小数部分。
函数 说明 numpy.around(<a>,<d>) 四舍五入,<d>表示舍入的小数位数。 numpy.floor(<a>) 向下取整。 numpy.ceil(<a>) 向上取整。 >>>import numpy as np >>>n = np.array([3.14159,0.22,-1.7,-0.2]) >>>n1 = np.round(n) >>>print(n1) [ 3. 0. -2. -0.] >>>n2 = np.floor(n) >>>print(n2) [ 3. 0. -2. -1.] >>>n3 = np.ceil(n) >>>print(n3) [ 4. 1. -1. -0.]
8.10 算数运算
1) numpy.add(<arr1>,<arr2>)
- 将两个数组的元素相加。
>>>import numpy as np >>>n1 = np.arange(1,10) >>>n2 = np.arange(1,10) >>>n_sum = np.add(n1,n2) >>>print(n_sum) [ 2 4 6 8 10 12 14 16 18]
2) numpy.subtract(<arr1>,<arr2>)
- 将两个数组的元素相减。
>>>import numpy as np >>>n1 = np.arange(1,10) >>>n2 = np.arange(1,10) >>>n_sub = np.subtract(n1,n2) >>>print(n_sum) [0 0 0 0 0 0 0 0 0]
3) numpy.multiply(<arr1>,<arr2>)
- 将两个数组的元素相乘。
>>>import numpy as np >>>n1 = np.arange(1,10) >>>n2 = np.arange(1,10) >>>n_mul = np.multiply(n1,n2) >>>print(n_sum) [ 1 4 9 16 25 36 49 64 81]
4) numpy.devide(<arr1>,<arr2>)
- 将两个数组的元素相除。
>>>import numpy as np >>>n1 = np.arange(1,10) >>>n2 = np.arange(1,10) >>>n_div = np.divide(n1,n2) >>>print(n_div) [1. 1. 1. 1. 1. 1. 1. 1. 1.]
5) numpy.reciprocal(<arr>)
- 获得数组中元素的倒数。
- 元素不能为0。
>>>import numpy as np >>>n = np.array([1/2,0.4,1,2.5,4,-2.5]) >>>n_rec = np.reciprocal(n) >>>print(n_rec) [ 2. 2.5 1. 0.4 0.25 -0.4 ]
6) numpy.power(<arr1>,<arr2>)
- 返回一个新的数组,将N数组<arr1>的元素作为底数,<arr2>中的元素作为幂。
>>>import numpy as np >>>n1 = np.arange(1,10) >>>n2 = np.arange(1,10) >>>n_pow = np.power(n1,n2) >>>print(n_pow) [ 1 4 27 256 3125 46656 823543 16777216 387420489]
7) numpy.mod(<arr1>,<arr2>)/numpy.remainder(<arr1>,<arr2>)
- 返回练个数组中元素想除的余数。
>>>import numpy as np >>>n1 = np.arange(1,11) >>>n2 = np.arange(1,20,2) >>>n_mod = np.mod(n1,n2) >>>print(n_mod) [ 0 2 3 4 5 6 7 8 9 10]
8) numpy.real(<arr>)
- 返回元素中复数所有的实数部分。
>>>import numpy as np >>>n = np.array([6+5j,1+2j,15+4j]) >>>n_read = np.real(n) >>>print(n_read) [ 6. 1. 15.]
9) numpy.imag(<arr>)
- 返回元素中复数所有的虚数部分。
>>>import numpy as np >>>n = np.array([6+5j,1+2j,15+4j]) >>>n_read = np.imag(n) >>>print(n_read) [5. 2. 4.]
10) numpy.conj(<arr>)
- 返回元素中复数通过改变虚部的符号而获得的共轭复数。
>>>import numpy as np >>>n = np.array([6+5j,1+2j,15+4j]) >>>n_read = np.conj(n) >>>print(n_read) [ 6.-5.j 1.-2.j 15.-4.j]
11) numpy.angle(<arr>)
- 返回元素中复数参数的角度。
>>>import numpy as np >>>n = np.angle([6+5j,1+2j,15+4j]) >>>n_read = np.conj(n) >>>print(n_read) [0.69473828 1.10714872 0.26060239]
8.11 统计函数
1) numpy.amin(<arr>,<axis=0>)
- 返回数组中每个维度的最小值。
>>>import numpy as np >>>n = np.array([[1,3,5],[2,4,6],[7,8,9]]) >>>print(np.amin(n,1)) [1 2 7]
2) numpy.amax(<arr>,<axis=0>)
- 返回数组中每个维度的最大值。
>>>import numpy as np >>>n = np.array([[1,3,5],[2,4,6],[7,8,9]]) >>>print(np.amax(n,1)) [5 6 9]
3) numpy.ptp(<arr>,<axis=0>)
- 返回数组中每个维度的极差。
>>>import numpy as np >>>n = np.array([[1,3,5],[2,4,6],[7,8,9]]) >>>print(np.ptp(n,0)) [6 5 4]
4) numpy.percentile(<arr>,<q>,<axis>)
- 返回数组中每个维度的百分位数(详情见第一篇的分位数部分)。
- <q>表示所取的百分位数。
>>>import numpy as np >>>n = np.array([[1,3,5],[2,4,6],[7,8,9]]) >>>print(np.percentile(n,25,0)) [1.5 3.5 5.5]
5) numpy.median(<arr>,<axis>)
- 返回数组中每个维度的中位数。
>>>import numpy as np >>>n = np.array([[1,3,5],[2,4,6],[7,8,9]]) >>>print(np.median(n,1)) [3. 4. 8.]
6) numpy.mean(<arr>,<axis>)
- 返回数组中每个维度的算数平均值。
>>>import numpy as np >>>n = np.array([[1,3,9],[2,4,8],[7,8,10]]) >>>print(np.mean(n,1)) [4.33333333 4.66666667 8.33333333]
7) numpy.average(<arr>,<axis>)
- 返回数组中每个维度的加权平均值。
>>>import numpy as np >>>n = np.array([[1,1,3,9],[2,2,4,8],[3,7,8,10]]) >>>print(np.average(n,1)) [3.5 4. 7. ]
8) numpy.std(<arr>,<axis>)
- 返回数组中每个维度的标准差。
>>>import numpy as np >>>n = np.array([[1,1,3,9],[2,2,4,8],[3,7,8,10]]) >>>print(np.std(n,1)) [3.27871926 2.44948974 2.54950976]
9) numpy.var(<arr>,<axis>)
- 返回数组中每个维度的方差。
>>>import numpy as np >>>n = np.array([[1,1,3,9],[2,2,4,8],[3,7,8,10]]) >>>print(np.var(n,1)) [10.75 6. 6.5 ]
8.12 排序函数
1) numpy.sort(<arr>,<axis>,<kind="quicksort">,<order>)
- 将数组中的元素按某种顺序<kind>排序。
- <order>表示要排序的字段(如果有的话)。
- <kind>排序方式包括:
类型 含义 速度 是否稳定 quicksort 快速排序 1 否 mergesort 归并排序 2 是 heapsort 堆排序 3 否 >>>import numpy as np >>>n = np.array([[1,3,1,9],[8,2,2,4],[3,8,7,10]]) >>>print(np.sort(n,1,kind="mergesort")) [[ 1 1 3 9] [ 2 2 4 8] [ 3 7 8 10]]
2) numpy.argsort(<arr>,<axis>,<kind="quicksort">,<order>)
- 与numpy.sort()同样的方式排序,但返回的是元素的索引。
>>>import numpy as np >>>n = np.array([[1,3,1,9],[8,2,2,4],[3,8,7,10]]) >>>print(np.argsort(n,1,kind="mergesort")) [[0 2 1 3] [1 2 3 0] [0 2 1 3]]
3) numpy.lexsort(<arr1>,<arr2>)
- 对数组中的元素一一对应排序,并返回元祖列表的索引。
>>>import numpy as np >>>n1 = np.array(['a','B',10]) >>>n2 = np.array(['A','b',20]) >>>print(np.lexsort((n1,n2))) >>>print([n1[i] + ", " + n2[i] for i in np.lexsort((n1,n2))]) [2 0 1] ['10, 20', 'a, A', 'B, b']
8.13 搜索函数
1) numpy.argmin(<arr>,<axis>)
- 返回数组中的元素的最小值索引。
>>>import numpy as np >>>n = np.array([1,2,3,4,5,6,7,8,9]) >>>print(np.argmin(n)) 0
2) numpy.argmax(<arr>,<axis>)
- 返回数组中的元素的最大值索引。
>>>import numpy as np >>>n = np.array([1,2,3,4,5,6,7,8,9]) >>>print(np.argmax(n)) 8
3) numpy.nonzero(<arr>,<axis>)
- 返回数组中的元素的非零元素的索引。
>>>import numpy as np >>>n = np.array([1,0,2,3,0,4,5,0,6,7,0,8,9]) >>>print(np.nonzero(n)) (array([ 0, 2, 3, 5, 6, 8, 9, 11, 12], dtype=int64),)
4) numpy.where(<condition>)
- 返回数组中满足给定条件元素的索引。
>>>import numpy as np >>>n = np.array([1,0,2,3,0,4,5,0,6,7,0,8,9]) >>>print(np.where(n>5)) (array([ 8, 9, 11, 12], dtype=int64),)
8.14 计数函数
1) numpy.extract(<arr>,<condition>)
- 返回数组中满足任何条件元素布尔值的索引。
>>>import numpy as np >>>n = np.array([[1,3,1,9],[8,2,2,4],[3,8,7,10]]) >>>condition = np.subtract(n,4) > 0 >>>print(np.extract(n,condition)) [False False False True True False False False False True True True]
8.15 字节交换
1) numpy.ndarray.byteswap()
- 交换数组中每个元素字节大端和小端位置。
>>>import numpy as np >>>n1 = np.arange(1,20,2) >>>print([np.binary_repr(x) for x in n1]) ['1', '11', '101', '111', '1001', '1011', '1101', '1111', '10001', '10011'] >>>n2 = n1.byteswap(); >>>print([np.binary_repr(x) for x in n2]) ['1000000000000000000000000', '11000000000000000000000000', '101000000000000000000000000', '111000000000000000000000000', '1001000000000000000000000000', '1011000000000000000000000000', '1101000000000000000000000000', '1111000000000000000000000000', '10001000000000000000000000000', '10011000000000000000000000000']
8.16 N数组的线性代数
1) numpy.dot(<arr1>,<arr2>)
- 返回两个数组的点积。
>>>import numpy as np >>>a = np.array([[1,2],[3,4]]) >>>b = np.array([[5,6],[7,8]]) >>>print(np.dot(a,b)) [[19 22] [43 50]]
2) numpy.vdot(<arr1>,<arr2>)
- 返回两个向量的点积。
>>>import numpy as np >>>a = np.array([[1,2],[3,4]]) >>>b = np.array([[5,6],[7,8]]) >>>print(np.vdot(a,b)) 70
3) numpy.inner(<arr1>,<arr2>)
- 返回两个数组的向量内积。
>>>import numpy as np >>>a = np.array([[1,2],[3,4]]) >>>b = np.array([[5,6],[7,8]]) >>>print(np.inner(a,b)) [[17 23] [39 53]]
4) numpy.matmul(<arr1>,<arr2>)
- 返回两个人数组的矩阵乘积。
>>>import numpy as np >>>a = np.array([[1,2],[3,4]]) >>>b = np.array([[5,6],[7,8]]) >>>print(np.matmul(a,b)) [[19 22] [43 50]]
5) numpy.linalg.det(<arr>)
- 返回数组的矩阵行列式值。
>>>import numpy as np >>>n = np.array([[1,2,3],[4,5,6],[7,8,9]]) >>>print(np.linalg.det(n)) -9.51619735392994e-16
6) numpy.linalg.solve(<arr>)
- 返回数组的矩阵线性方程式的解。
>>>import numpy as np >>>a = np.array([[1,2],[3,4]]) >>>b = np.array([[5,6],[7,8]]) >>>print(np.linalg.solve(a,b)) [[-3. -4.] [ 4. 5.]]
7) numpy.linalg.inv(<arr>)
- 返回数组的矩阵的逆。
>>>import numpy as np >>>n = np.array([[1,2,3],[4,5,6],[7,8,9]]) >>>print(np.linalg.inv(n)) [[ 3.15251974e+15 -6.30503948e+15 3.15251974e+15] [-6.30503948e+15 1.26100790e+16 -6.30503948e+15] [ 3.15251974e+15 -6.30503948e+15 3.15251974e+15]]
9. N数组的I/O操作
1) numpy.save(<filename>,<arr>,<allow_pickles=false>)
- 将数组保存为.npy文件。
- 可以通过pickle对数据进行处理。
>>>import numpy as np >>>import os >>>n = np.array([[1,2,3],[4,5,6],[7,8,9]]) >>>np.save("np1",n) >>>print([x for x in os.listdir("C:\\Users\\xiaor\\") if x.endswith(".npy")]) ['np1.npy']
2) numpy.load(<filename>,<allow_pickles=false>)
- 从.npy文件读取数组。
- 可以通过pickle对数据进行处理。
>>>import numpy as np >>>n = np.load("np1.npy") >>>print(n) [[1 2 3] [4 5 6] [7 8 9]]
3) numpy.savetxt(<filename>,<arr>)
- 将文件保存为txt文本文件。
>>>import numpy as np >>>import os >>>n = np.array([[1,2,3],[4,5,6],[7,8,9]]) >>>np.savetxt("np1.txt",n) >>>print([x for x in os.listdir("C:\\Users\\xiaor\\") if x.endswith("txt")]) ['np1.txt']
4) numpy.loadtxt(<filename>)
- 从txt文本文件中读取数组。
>>>import numpy as np >>>n = np.loadtxt("np1.txt") >>>print(n) [[1. 2. 3.] [4. 5. 6.] [7. 8. 9.]]
参考资料
- numpy包的应用 作者:你们都厉害
- 理解numpy的rollaxis与swapaxes函数 作者:liaoyuecai