大师兄的Python机器学习笔记:Numpy库、Scipy库和Matplotlib库(一)

大师兄的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.]]

参考资料


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容