Numpy 数据处理技巧
· 7 min read

导入 numpy
import numpy as np # 国际惯例
查看版本
>>> np.__version__
'1.24.3'
创建数组
创建空数组
>>> np.array([])
array([], dtype=float64)
创建全 0 一维数组
>>> A1 = np.zeros(5)
>>> A1
array([0., 0., 0., 0., 0.])
和下面的代码是功能类似,但是非完全等价:
>>> A2 = np.array([0,0,0,0,0])
>>> A2
array([0, 0, 0, 0, 0])
二者的区别看下面:
>>> A1.dtype # np.zeros
dtype('float64')
>>> A2.dtype # np.array
dtype('int32')
创建非 0 一维数组
>>> np.array([1,2,3,4,5])
array([1, 2, 3, 4, 5])
创建全 0 二维数组
>>> np.zeros((5,5))
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
创建全 1 二维数组
>>> np.ones((3,5))
array([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]])
创建非 0 二维数组
>>> np.array([[1,2],
[3,4],
[5,6]])
array([[1, 2],
[3, 4],
[5, 6]])
创建非 0 三维数组
>>> np.array([[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
[[10, 11, 12], [13, 14, 15], [16, 17, 18]]
])
array([[[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9]],
[[10, 11, 12],
[13, 14, 15],
[16, 17, 18]]])
创建 0-1 随机数组
>>> np.random.randn(2,3,2) # 返回0-1之间的随机样本数
array([[[ 0.31828038, 0.7689764 ],
[-0.45125297, 1.21648636],
[ 0.64074149, 0.01148165]],
[[ 0.3273331 , -0.99450869],
[ 0.430959 , 1.88978962],
[ 0.40886625, -0.41752926]]])
创建正态分布数组
>>> np.random.randn(4,5) # 从标准正态分布(均值为0,标准差为1)中返回或填充数组
array([[-0.59880533, -0.4892546 , -0.11262313, -0.18888795, -0.29071441],
[-0.81646124, -0.04868196, -0.6480912 , 0.24923365, -0.52163335],
[-1.76748905, 0.8424851 , 0.77048079, -0.04080533, 1.85021566],
[-0.20228951, 1.61593328, 0.9793867 , -0.09846424, 0.788601 ]])
基于 np.arange 创建数组
>>> np.arange(10) # 默认间隔是1;不包含10,从0开始
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.arange(0,20,2) # 2是间隔
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
>>> np.arange(20,0,-2) # -2是间隔;包含20,不包含0
array([20, 18, 16, 14, 12, 10, 8, 6, 4, 2])
上面创建的是等差数列的数组;下面介绍创建等比数列的数组。
基于 np.logspace 创建数组
np.logspace(
start,
stop,
num=50,
endpoint=True,
base=10.0,
dtype=None,
axis=0,
)
>>> np.logspace(0,2,5) # 默认以10为底;取5个点; 10^0=1 10^2=100
array([ 1. , 3.16227766, 10. , 31.6227766 ,
100. ])
>>> np.logspace(0,2,5,base=2) # 以2为底;2^0=1, 2^2=4
array([1. , 1.41421356, 2. , 2.82842712, 4. ])
基于 np.linspace 创建数组
>>> np.linspace(1,10,50) # 在1到10(包含1和10)等间隔取50个数
array([ 1. , 1.18367347, 1.36734694, 1.55102041, 1.73469388,
1.91836735, 2.10204082, 2.28571429, 2.46938776, 2.65306122,
2.83673469, 3.02040816, 3.20408163, 3.3877551 , 3.57142857,
3.75510204, 3.93877551, 4.12244898, 4.30612245, 4.48979592,
4.67346939, 4.85714286, 5.04081633, 5.2244898 , 5.40816327,
5.59183673, 5.7755102 , 5.95918367, 6.14285714, 6.32653061,
6.51020408, 6.69387755, 6.87755102, 7.06122449, 7.24489796,
7.42857143, 7.6122449 , 7.79591837, 7.97959184, 8.16326531,
8.34693878, 8.53061224, 8.71428571, 8.89795918, 9.08163265,
9.26530612, 9.44897959, 9.63265306, 9.81632653, 10. ])
>>> np.linspace(1,9.9,20) # 1到9.9取20个数
array([1. , 1.46842105, 1.93684211, 2.40526316, 2.87368421,
3.34210526, 3.81052632, 4.27894737, 4.74736842, 5.21578947,
5.68421053, 6.15263158, 6.62105263, 7.08947368, 7.55789474,
8.02631579, 8.49473684, 8.96315789, 9.43157895, 9.9 ])
创建 shape 相同的数组
>>> arr1 = np.array([[1,2],[3,4],[5,6]])
>>> arr1
array([[1, 2],
[3, 4],
[5, 6]])
>>> arr1.shape
(3, 2)
创建 3*2 的全 0 数组:
>>> np.zeros_like(arr1)
array([[0, 0],
[0, 0],
[0, 0]])
创建 3*2 的全 1 数组:
>>> np.ones_like(arr1)
array([[1, 1],
[1, 1],
[1, 1]])
创建对角线为 1,其他元素为 0 的数组
>>> np.eye(5) # 主对角线元素为1
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
>>> np.eye(5,3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.],
[0., 0., 0.],
[0., 0., 0.]])
>>> np.eye(3,5)
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.]])
创建主对角线递增的数组
>>> np.diag([1,2,3,4])
array([[1, 0, 0, 0],
[0, 2, 0, 0],
[0, 0, 3, 0],
[0, 0, 0, 4]])
>>> np.diag(1 + np.arange(4))
array([[1, 0, 0, 0],
[0, 2, 0, 0],
[0, 0, 3, 0],
[0, 0, 0, 4]])
>>> np.diag(np.arange(1,5))
array([[1, 0, 0, 0],
[0, 2, 0, 0],
[0, 0, 3, 0],
[0, 0, 0, 4]])
创建单位矩阵(数组)
>>> np.identity(5) # 等价于np.eye(5)
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
上面介绍了多种数组创建方法,下面介绍数组的相关属性信息:
数组属性
创建边界全1,内部全0的数组
>>> Z = np.ones((5,5)) # 先创建全1
>>> Z[1:-1,1:-1] = 0 # 再把中间部分设置为0
>>> Z
array([[1., 1., 1., 1., 1.],
[1., 0., 0., 0., 1.],
[1., 0., 0., 0., 1.],
[1., 0., 0., 0., 1.],
[1., 1., 1., 1., 1.]])
创建边界全0,内部全1的数组
方式1
>>> Z = np.zeros((5,5)) # 先创建全1
>>> Z[1:-1,1:-1] = 1 # 再把中间部分设置为0
>>> Z
array([[0., 0., 0., 0., 0.],
[0., 1., 1., 1., 0.],
[0., 1., 1., 1., 0.],
[0., 1., 1., 1., 0.],
[0., 0., 0., 0., 0.]])
方式2
numpy.pad(array, # 待填充数组
pad_width, # 填充宽度;可以是整数或者形状为(m,2)
mode='constant', # 填充模式,constant-常数填充 edge-边缘值填充 linear_ramp:线性斜坡填充
**kwargs)
>>> Z = np.ones((3,3)) # 3*3的矩阵 上下左右扩充2次
>>> Z = np.pad(Z, pad_width=1, mode='constant', constant_values=0)
>>> Z
array([[0., 0., 0., 0., 0.],
[0., 1., 1., 1., 0.],
[0., 1., 1., 1., 0.],
[0., 1., 1., 1., 0.],
[0., 0., 0., 0., 0.]])
创建时间数组
>>> T = np.arange('2016-07', '2016-08', dtype='datetime64[D]')
>>> T
array(['2016-07-01', '2016-07-02', '2016-07-03', '2016-07-04',
'2016-07-05', '2016-07-06', '2016-07-07', '2016-07-08',
'2016-07-09', '2016-07-10', '2016-07-11', '2016-07-12',
'2016-07-13', '2016-07-14', '2016-07-15', '2016-07-16',
'2016-07-17', '2016-07-18', '2016-07-19', '2016-07-20',
'2016-07-21', '2016-07-22', '2016-07-23', '2016-07-24',
'2016-07-25', '2016-07-26', '2016-07-27', '2016-07-28',
'2016-07-29', '2016-07-30', '2016-07-31'], dtype='datetime64[D]')