NumPy
是针对多维数组的一个科学计算包,有许多函数可以用于数组间计算。但是要注意,数组内的元素必须是相同数据类型的。
首先要
import numpy as np
np.array()
,传入任何序列对象都行,比如列表、元组、字符串等。
>>> arr = np.array([2,4,6,8])
>>> arr
array([2, 4, 6, 8])
>>> print(arr)
[2 4 6 8]
还可以生成多维数组,传入嵌套序列即可。例如生成二维数组:
>>> arr = np.array([[2,4],[6,8]])
>>> arr
array([[2, 4],
[6, 8]])
np.arange(start,stop,step)
,生成一个以start
(默认为0)开始,stop
结束(不包括stop
),步长为step
(默认为1)的序列。
>>> np.arange(1,15,3)
array([ 1, 4, 7, 10, 13])
np.zeros()
>>> np.zeros(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
>>> np.zeros((3,4)) #生成3×4的矩阵
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
np.ones()
,用法同上。
np.eye(num)
,生成num
维单位矩阵。
>>> np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]]
用于生成(0,1)
之间的随机数组。
当给rand()
传入一个具体值num
时,生成一个长度为num
的随机数组。
当给rand()
传入一对值时,生成相应行列的多维数组。
>>> np.random.rand()
0.43101195145330806
>>> np.random.rand(3)
array([0.27294823, 0.42849383, 0.41479483])
>>> np.random.rand(2,3)
array([[0.35974834, 0.39223821, 0.35084728],
[0.06587696, 0.41634962, 0.13933984]])
用来生成满足正态分布的指定形状数组。
对于传参同上。
>>> np.random.randn(3)
array([-0.15161607, 0.75490682, 0.76521087])
>>> np.random.randn(2,3)
array([[0.29118303, 2.03253717, 1.52058208],
[1.42187346, 0.35287314, 1.35656093]])
与arange()
方法类似,用于生成一定范围内的随机整数数组。
randint(low,high=None,size=None)
。当给size
传一个值生成的是一维数组,传一对值就是多维数组。
>>> np.random.randint(0,5,10)
array([1, 4, 4, 2, 2, 4, 2, 4, 1, 2])
>>> np.random.randint(5,size=(2,3))
array([[3, 1, 4],
[3, 1, 2]])
主要用于从已知数组中随机选取相应大小的数组。
choice(arr,size=None,replace=None)
,从数组arr
中选取大小为size
的数组作为一个新的数组。
arr
是整数时,从range(int)
中采用;是数组时,就从数组中取样。
size
的设置同上。
>>> np.random.choice(10,5)
array([9, 0, 4, 6, 7])
>>> np.random.choice(10,(2,3))
array([[3, 9, 8],
[6, 2, 3]])
将原数组顺序打乱。
>>> arr = np.arange(10)
>>> arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.random.shuffle(arr)
>>> arr
array([4, 5, 8, 9, 3, 6, 0, 1, 7, 2])
shape
>>> arr = np.zeros((2,3))
>>> arr.shape
(2, 3)
size
,总共有多少个元素
>>> arr = np.zeros((2,3))
>>> arr.size
6
dtype
>>> arr.dtype
dtype('float64')
数据类型主要有:
ndim
>>> arr = np.zeros((2,3))
>>> arr.ndim
2
像列表那样传索引获取:
>>> arr = np.arange(10)
>>> arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> arr[3]
3
>>> arr[-1]
9
>>> arr[1:-2]
array([1, 2, 3, 4, 5, 6, 7])
还可以传入某个判断条件,将返回符合该条件的元素
>>> arr[arr>3]
array([4, 5, 6, 7, 8, 9])
也跟列表差不多,只是每个元素变成了列表。
>>> arr = np.array([[2,4,6],[6,8,10],[1,3,5]])
>>> arr
array([[ 2, 4, 6],
[ 6, 8, 10],
[ 1, 3, 5]])
>>> arr[1]
array([ 6, 8, 10])
>>> arr[1:3]
array([[ 6, 8, 10],
[ 1, 3, 5]])
直接在列位置传入这个列的索引,例子如下:
>>> arr[:,2] #获取第三列
array([ 6, 10, 5])
>>> arr[:,[0,1]] #获取第1、2列
array([[2, 4],
[6, 8],
[1, 3]])
>>> arr[:,0:2] #获取第1、2列
array([[2, 4],
[6, 8],
[1, 3]])
分别在行、列位置指明就行,例子如下:
>>> arr
array([[ 2, 4, 6],
[ 6, 8, 10],
[ 1, 3, 5]])
>>> arr[0:2,1:3] #获取第1、2行的 第2、3列
array([[ 4, 6],
[ 8, 10]])
astype()
,传参数为np里的数据类型
>>> arr = np.array([True,True,False])
>>> arr.dtype
dtype('bool')
>>> arr.astype(np.int) #将arr转为int类型数组
array([1, 1, 0])
>>> arr_str = arr.astype(np.string_) #将arr转为str类型数组
>>> arr_str
array([b'True', b'True', b'False'], dtype='|S5')
>>> arr_str.dtype
dtype('S5')
先判断是否含有缺失值(NumPy
中缺失值用np.nan
表示),有则将其找出来(用isnan()
,相应位置是缺失值则返回True
,否则返回False
);再对缺失值进行填充。
#创建一个有缺失值的数组
>>> arr = np.array([1,2,np.nan,4])
>>> arr
array([ 1., 2., nan, 4.]) #nan表示缺失值
>>> np.isnan(arr)
array([False, False, True, False]) #第三个为缺失值
>>> arr[np.isnan(arr)] = 0 #用0来填充缺失值(会对True的位置来填充)
>>> arr
array([1., 2., 0., 4.])
直接调用unique()方法可以去除重复值:
>>> arr = np.array([1,1,2,3,3])
>>> np.unique(arr)
array([1, 2, 3])
所谓重塑就是改变数组的形状,比如将3×4的变成4×3的数组。
将一维数组重塑为多行多列的数组,用reshape()方法:
>>> arr = np.arange(8)
>>> arr
array([0, 1, 2, 3, 4, 5, 6, 7])
>>> arr.reshape(2,4) #重塑为2行4列数组
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
>>> arr.reshape(4,2)
array([[0, 1],
[2, 3],
[4, 5],
[6, 7]])
用法一样:
>>> arr = np.array([[2,4,6,8],[2,6,8,10],[1,3,5,7]])
>>> arr
array([[ 2, 4, 6, 8],
[ 2, 6, 8, 10],
[ 1, 3, 5, 7]])
>>> arr.reshape(2,6)
array([[ 2, 4, 6, 8, 2, 6],
[ 8, 10, 1, 3, 5, 7]])
>>> arr.reshape(4,3)
array([[ 2, 4, 6],
[ 8, 2, 6],
[ 8, 10, 1],
[ 3, 5, 7]])
.T方法,n×m变m×n数组。
>>> arr = np.array([[2,4,6,8],[2,6,8,10],[1,3,5,7]])
>>> arr
array([[ 2, 4, 6, 8],
[ 2, 6, 8, 10],
[ 1, 3, 5, 7]])
>>> arr.T
array([[ 2, 2, 1],
[ 4, 6, 3],
[ 6, 8, 5],
[ 8, 10, 7]])
将两个行数相等的数组在行方向上进行简单拼接。
将待合并的数组以列表形式传给它,再通过设置axis=1
指明在行方向上合并。
>>> arr1 = np.array([[1,2,3],[4,5,6]])
>>> arr2 = np.array([[4,5,6,7],[7,8,9,0]])
>>> np.concatenate([arr1,arr2], axis=1)
array([[1, 2, 3, 4, 5, 6, 7],
[4, 5, 6, 7, 8, 9, 0]])
将待合并的数组以元组形式传给它即可。
>>> np.hstack((arr1,arr2))
array([[1, 2, 3, 4, 5, 6, 7],
[4, 5, 6, 7, 8, 9, 0]])
将待合并的数组以元组形式传给它即可。
>>> np.column_stack((arr1,arr2))
array([[1, 2, 3, 4, 5, 6, 7],
[4, 5, 6, 7, 8, 9, 0]])
将两个列数相等的数组在行方向上进行简单拼接。用法与横向合并类似。
只需要axis=0
即可。
>>> arr1 = np.array([[1,2,3],[4,5,6]])
>>> arr2 = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> np.concatenate([arr1,arr2] ,axis=0)
array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> np.vstack((arr1,arr2))
array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> np.row_stack((arr1,arr2))
array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
注意:当只有行数或列数不同时,可以不设置axis
参数,按可以合并的方向合并。
函数 | 说明 |
---|---|
abs | 求各个元素的绝对值 |
sqrt | 求各个元素的平方根 |
square | 求各个元素的平方 |
exp | 计算各个元素的以e为底的指数,e^x |
log、log10、log2、log1p | 分别计算以e为底、10为底、2为底的对数,以及log(1+x) |
modf | 适用于浮点数,将小数和整数部分以独立的数组返回 |
isnan | 用来判断是否是NaN,返回布尔值 |
>>> arr1 = np.array([[1,2,3],[4,5,6]])
>>> np.square(arr1)
array([[ 1, 4, 9],
[16, 25, 36]], dtype=int32)
对整个NumPy数组或某条轴的数据进行统计运算,主要函数:
函数 | 说明 |
---|---|
sum | 对数组中的全部元素或某行/列的元素求和 |
mean | 平均值求取 |
std | 标准差 |
var | 方差 |
min、max | 最大值、最小值 |
argmax、argmin | 返回最大值、最小值的对应索引 |
cumsum | 所有元素累计和,结果以数组形式返回 |
sumprod | 所有元素的累计积 |
通过设置axis
参数选择对行/列,或所有元素进行统计。
>>> arr1 = np.array([[1,2,3],[4,5,6]])
>>> arr1.sum()
21
>>> arr1.sum(axis=1) #对数组中每一行分别求和
array([ 6, 15])
>>> arr1.sum(axis=0) #对数组中每一列分别求和
array([5, 7, 9])
np.where(condition, x, y)
,如果condition
(条件)为真返回x,否则返回y。
>>> arr = np.array([50,60,70,50])
>>> np.where(arr==50,'等于50','不等于50')
array(['等于50', '不等于50', '不等于50', '等于50'], dtype=')
>>> np.where(arr>=60) #返回满足条件的值的索引
(array([1, 2], dtype=int64),)
每个数组可以粗略当作一个集合(当然集合不该有重复元素~),可以进行集合关系的运算,主要有包含、交集、并集、差集。
>>> arr1 = np.array([1,2,3,4])
>>> arr2 = np.array([1,2,5])
#判断数组arr1中包含数组arr2中的哪些值,如果包含则对应位置返回True,否则返回False。
>>> np.in1d(arr1,arr2)
array([ True, True, False, False])
#返回两个数组的交集
>>> np.intersect1d(arr1,arr2)
array([1, 2])
#返回两个数组的并集
>>> np.union1d(arr1,arr2)
array([1, 2, 3, 4, 5])
#返回两个数组的差集
>>> np.setdiff1d(arr1,arr2)
array([3, 4])