NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
创建数组
1、numpy.ndarray
ndarray 对象是用于存放同类型元素的多维数组,每个元素在内存中都有相同存储大小的区域。
>>> import numpy as np
>>> a = np.array([[10,20,30],[40,50,60],[70,80,90]])
>>> a
array([[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]])
#可以指定数据类型
>>> a = np.array([6,12,3],dtype=np.int)
>>> a.dtype
int32
>>> a = np.array([6,12,3],dtype=np.float)
>>> a.dtype
float64
2、numpy.empty
numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组。
numpy.empty(shape, dtype = float, order = ‘C’)
order:有"C"和"F"两个选项,分别代表行优先和列优先,在计算机内存中的存储元素的顺序。
>>> a = np.empty([3,4],dtype=int)
>>> a
array([[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]])
3、numpy.zeros
创建指定大小的数组,数组元素以 0 来填充。
numpy.zeros(shape, dtype = float, order = ‘C’)
order:‘C’ 用于 C 的行数组,或者 ‘F’ 用于 FORTRAN 的列数组
>>> a = np.zeros((3,4))
>>> a
array([[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]])
4、numpy.ones
创建指定形状的数组,数组元素以 1 来填充。
numpy.ones(shape, dtype = None, order = ‘C’)
>>> a = np.ones((3,4))
>>> a
array([[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]])
5、numpy.arange
使用 arange 函数创建数值范围并返回 ndarray 对象。
numpy.arange(start, stop, step, dtype)
>>> a = np.arange(10,20,2)
>>> a
array([10, 12, 14, 16, 18])
>>> a = np.arange(12).reshape((3,4))
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
6、numpy.linspace
创建一个一维数组,数组是一个等差数列构成的。
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
num:要生成的等步长的样本数量,默认为50;
endpoint:该值为 true 时,数列中中包含stop值,反之不包含,默认是True;
retstep:如果为 True 时,生成的数组中会显示间距,反之不显示。
>>> a = np.linspace(1,10,4)
>>> a
array([ 1. 4. 7. 10.])
#可以通过reshape改变形状
>>> a = np.linspace(1,10,4).reshape((2,2))
>>> a
array([[ 1. 4.]
[ 7. 10.]])
7、numpy.random.random
创建指定形状的随机数组。
>>> a = np.random.random((2,4))
>>> a
array([[0.51560035 0.90616572 0.58319964 0.10042999]
[0.77632944 0.83235997 0.45486569 0.12400622]])
numpy数组属性
首先创建一个ndarray 对象
>>> array = np.array([[1,2,3],[2,3,4]])
>>> print(array)
[[1 2 3]
[2 3 4]]
查看维数
>>> print('number of dim:',array.ndim)
number of dim: 2
查看形状
>>> print('shape:',array.shape)
shape: (2, 3)
查看容量
>>> print('size:',array.size)
size: 6
numpy基础运算
首先创建两个随机数组
>>> a = np.array([[10,20,30],[40,50,60],[70,80,90]])
>>> b = np.arange(1,10,1).reshape((3,3))
>>> print(a)
[[10 20 30]
[40 50 60]
[70 80 90]]
>>> print(b)
[[1 2 3]
[4 5 6]
[7 8 9]]
加法
>>> a + b
array([[11, 22, 33],
[44, 55, 66],
[77, 88, 99]])
减法
>>> a - b
array([[ 9, 18, 27],
[36, 45, 54],
[63, 72, 81]])
对应元素相乘
>>> a * b
array([[ 10, 40, 90],
[160, 250, 360],
[490, 640, 810]])
矩阵相乘
>>> np.dot(a,b) #也可写为a.dot(b)
array([[ 300, 360, 420],
[ 660, 810, 960],
[1020, 1260, 1500]])
对应元素相除
>>> a / b
array([[10., 10., 10.],
[10., 10., 10.],
[10., 10., 10.]])
各个元素的n次方
>>> b ** 2
array([[ 1, 4, 9],
[16, 25, 36],
[49, 64, 81]], dtype=int32)
最大值
>>> a.max() #也可写为np.max(a)
90
#可指定求行最大值或列最大值
np.max(a,axis=0) #每列最大值
array([70, 80, 90])
np.max(a,axis=1) #每行最大值
array([30, 60, 90])
最小值
>>> a.min() #也可写为np.min(a)
10
#可指定求行最小值或列最小值
np.min(a,axis=0) #每列最小值
array([10, 20, 30])
np.min(a,axis=1) #每行最小值
array([10, 40, 70])
求和
>>> a.sum() #也可写为np.sum(a)
450
#可指定求各行之和或各列之和
np.sum(a,axis=0) #每列之和
array([120, 150, 180])
np.sum(a,axis=1) #每行之和
array([ 60, 150, 240])
求均值
>>> a.mean() #也可写为np.mean(a)
50.0
#可指定求各行均值或各列均值
>>> np.mean(a,axis=0) #每列均值
array([40., 50., 60.])
>>> np.mean(a,axis=1) #每行均值
array([20., 50., 80.])
求中值
np.median(a)
50.0
#可指定求各行中值或各列中值
>>> np.median(a,axis=0) #每列中值
array([40., 50., 60.])
>>> np.median(a,axis=1) #每行中值
array([20., 50., 80.])
元素累加
>>> np.cumsum(a)
array([ 10, 30, 60, 100, 150, 210, 280, 360, 450], dtype=int32)
元素之差
>>> np.diff(a)
array([[10, 10],
[10, 10],
[10, 10]])
矩阵转置
>>> np.transpose(a) #也可写为a.T
array([[10, 40, 70],
[20, 50, 80],
[30, 60, 90]])
排序
>>> np.sort(a)
array([[10, 20, 30],
[40, 50, 60],
[70, 80, 90]])
固定元素范围
>>> np.clip(a,50,70) #小于50的元素变成50,大于70的元素变为70,位于中间的元素不变
array([[50, 50, 50],
[50, 50, 60],
[70, 70, 70]])
三角函数
>>> np.sin(a)
array([[-0.54402111, 0.91294525, -0.98803162],
[ 0.74511316, -0.26237485, -0.30481062],
[ 0.77389068, -0.99388865, 0.89399666]])
>>> np.cos(a)
array([[-0.83907153, 0.40808206, 0.15425145],
[-0.66693806, 0.96496603, -0.95241298],
[ 0.6333192 , -0.11038724, -0.44807362]])
>>> np.tan(a)
array([[ 0.64836083, 2.23716094, -6.4053312 ],
[-1.11721493, -0.27190061, 0.32004039],
[ 1.22195992, 9.00365495, -1.99520041]])
查找最值索引
>>> np.argmin(a)
0
>>> np.argmax(a)
8
比较
>>> a < 50
array([[ True, True, True],
[ True, False, False],
[False, False, False]])
>>> a == 70
array([[False, False, False],
[False, False, False],
[ True, False, False]])
numpy索引
>>> a
array([[10, 20, 30],
[40, 50, 60],
[70, 80, 90]])
找出某一行
>>> a[2]
array([70, 80, 90])
找出某一列
>>> a[:,1]
array([20, 50, 80])
找出某一元素
>>> a[1][1]
50
找出某一范围内的元素
>>> a[1,0:2]
array([40, 50])
遍历出每一行
>>> for row in a:
>>> print(row)
[10 20 30]
[40 50 60]
[70 80 90]
遍历出每一列
>>> for column in a.T:
>>> print(column)
[10 40 70]
[20 50 80]
[30 60 90]
遍历出每一个元素
>>> for item in a.flat:
>>> print(item,end=' ')
10 20 30 40 50 60 70 80 90
numpy数组合并
>>> A = np.array([[1,1],[1,1]])
>>> B = np.array([[2,2],[2,2]])
>>> print(A)
[[1 1]
[1 1]]
>>> print(B)
[[2 2]
[2 2]]
np.vstack纵向合并
>>> C = np.vstack((A,B))
>>> print(C)
[[1 1]
[1 1]
[2 2]
[2 2]]
>>> print(A.shape,B.shape,C.shape)
(2, 2) (2, 2) (4, 2)
np.hstack横向合并
>>> D = np.hstack((A,B))
>>> print(D)
[[1 1 2 2]
[1 1 2 2]]
>>> print(A.shape,B.shape,D.shape)
(2, 2) (2, 2) (2, 4)
np.concatenate指定合并方式
>>> E = np.concatenate((A,B),axis=0)
>>> F = np.concatenate((A,B),axis=1)
>>> print(E.shape,F.shape)
(4, 2) (2, 4)
numpy数组分割
>>> A = np.arange(12).reshape((3,4))
>>> print(A)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
np.vsplit纵向分割
>>> np.vsplit(A,3)
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
np.hsplit横向分割
>>> np.hsplit(A,2)
[array([[0, 1],
[4, 5],
[8, 9]]),
array([[ 2, 3],
[ 6, 7],
[10, 11]])]
np.split指定分割方式
>>> np.split(A,3,axis=0)
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
>>> np.split(A,2,axis=1)
[array([[0, 1],
[4, 5],
[8, 9]]),
array([[ 2, 3],
[ 6, 7],
[10, 11]])]
注:以上三种方式只能进行对等分割,如果不能平均分割成指定的个数则会报错。
np.array_split可进行不对等分割,当不能均匀分割时,第一部分将得到更多的元素。
>>> np.array_split(A,3,axis=1)
[array([[0, 1],
[4, 5],
[8, 9]]),
array([[ 2],
[ 6],
[10]]),
array([[ 3],
[ 7],
[11]])]
numpy数组的复制
1、赋值
将一个变量的值赋值给另一个变量,这两个变量本质上是一样的,共同指向同一个存储位置,改变一个变量,另一个也随之改变。
>>> a = np.arange(4)
>>> b = a
>>> a
array([0, 1, 2, 3])
>>> b
array([0, 1, 2, 3])
>>> a[0] = 11
>>> a
array([11, 1, 2, 3])
>>> b
array([11, 1, 2, 3])
>>> b is a
True
2、.copy()深度复制
通过copy函数,两个变量虽然值相同,但本质上是不同的变量,互不影响。
>>> b = a.copy()
>>> a
array([0, 1, 2, 3])
>>> b
array([0, 1, 2, 3])
>>> a == b
array([ True, True, True, True])
>>> a is b
False
>>> a[0] = 11
>>> a
array([11, 1, 2, 3])
>>> b
array([0, 1, 2, 3])