NumPy(Numeric Python)是一个开源的Python科学计算基础库,用于处理多维数组运算:官网
NumPy库中最基础数据类型是由同种元素构成的ndarray,它的维度叫做轴(axis),轴的个数叫做秩(rank)
ndarray是一个多维数组的对象,由两部分构成:
属性 | 说明 |
---|---|
.dim | 秩,即轴的数量或维度的数量 |
.shape | ndarray对象的尺寸 |
.size | ndarray对象元素的个数 |
.dtype | ndarray对象的元素类型 |
.itemsize | ndarray对象每个元素的大小 |
Python 本身支持的数值类型有 int(整型)、float(浮点型)、bool(布尔型) 和 complex(复数型)。而 NumPy 支持比 Python 本身更为丰富的数值类型。numpy 的数值类型实际上是 dtype 对象的实例。常用的数据类型有:
数据类型 | 说明 |
---|---|
bool | 布尔类型 |
int8 | 字节(-128 to 127) |
int16 | 整数(- 2 15 2^{15} 215 to 2 15 − 1 2^{15}-1 215−1) |
int32 | 整数(- 2 31 2^{31} 231 to 2 31 − 1 2^{31}-1 231−1) |
int64 | 整数(- 2 63 2^{63} 263 to 2 63 − 1 2^{63}-1 263−1) |
float16 | 半精度浮点数 |
float32 | 单精度浮点数 |
float64 | 双精度浮点数 |
complex64 | 复数,表示双 32 位浮点数 |
complex128 | 复数,表示双 64 位浮点数 |
import numpy as np # 习惯引用语句
在 NumPy 中,我们使用 np.array 函数将列表或元组转换为 ndarray 数组。其方法为:
# object:列表、元组等。
# dtype:数据类型。如果未给出,则类型为被保存对象所需的最小类型。
np.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
一般只用到前两个参数,x = np.array(/
np.array([[1, 2, 3], [4, 5, 6]],dtype=np.int64)
np.array([(1, 2), (3, 4), (5, 6)])
函数 | 描述 | 举例 |
---|---|---|
np.arange(start,stop,step,dtype=None) | 类似range()函数,创建一个由start到stop,以step为步长的数组 | np.arange(1,10,2) |
np.zeros(shape,dtype=None) | 根据shape生成一个全0数组,shape是元组类型 | np.zeros((2,5)) |
np.ones(shape,dtype=None) | 根据shape生成一个全1数组,shape是元组类型 | np.ones((2,5)) |
np.full(shape,val) | 根据shape生成一个数组,每个元素值是val | np.full((2,4),3) |
np.eye(n) | 创建nxn的单位矩阵,对角线为1,其余为0 | np.eye(5) |
一维数组索引与切片,与列表相似(python列表索引:click here)
直接以二维数组为例:通过对每个以逗号分隔的维度执行单独的切片,可以对多维数组进行切片。对于二维数组,第一片定义了行的切片,第二片定义了列的切片。
import numpy as np
# 创建一个5x5的二维数组
x = np.array([[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
[26, 27, 28, 29, 30],
[31, 32, 33, 34, 35]])
操作 | 结果 |
---|---|
x[0:2] | [ [11 12 13 14 15] [16 17 18 19 20] ] |
x[1:5:2] | [ [16 17 18 19 20] [26 27 28 29 30] ] |
x[2:] | [ [21 22 23 24 25] [26 27 28 29 30] [31 32 33 34 35] ] |
x[:-2] | [ [11 12 13 14 15] [16 17 18 19 20] [21 22 23 24 25] ] |
x[2 , : ] | [21 22 23 24 25] |
x[ : , -2 ] | [13 18 23 28 33] |
x[ 1:4 , 0 ] | [16 21 26] |
x[ 1:3 , 2:4] | [[18 19] [23 24]] |
x[ : : 2 , : : 2] | [ [11 13 15] [21 23 25] [31 33 35] ] |
…
索引通过省略号来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray
import numpy as np
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
操作 | 描述 | 结果 |
---|---|---|
a[… , 1] | 取第二列的元素 | [2 4 5] |
a[1 , …] | 取第二行的元素 | [3 4 5] |
a[… , 1 : ] | 第二列及剩下的所有元素 | [ [2 3] [4 5] [5 6] ] |
a[… , : :-1] | 按照列的维度翻转 | [ [3 2 1] [5 4 3] [6 5 4] ] |
方括号内传入多个索引值,可以同时选择多个元素
一维数组:
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8]) #创建一个一维数组
print(x[0,1,2]) # [1,2,3]
二维数组:
x = np.array([[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
[26, 27, 28, 29, 30],
[31, 32, 33, 34, 35]])
print(x[0,1,-1]) #选择行的索引是0,1,-1(也就是5)
row = [0, 1, 2]
col = [2, 3, 4]
y = x[row, col] #选择行的索引为0,1,2,列的索引为2,3,4
print(y) # [13 19 25]
[ [11 12 13 14 15]
[16 17 18 19 20]
[31 32 33 34 35] ]
[13 19 25]
import numpy as np
x = np.array([[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
[26, 27, 28, 29, 30],
[31, 32, 33, 34, 35]])
y = x[0:3, [1, 2]] #选择行的索引为0-3,列的索引为1和2
print(y)
[ [12 13 ]
[17 18 ]
[22 23 ] ]
函数 | 描述 |
---|---|
np.reshape(a,newshape) | 重设形状,不改变原数据 |
np.flatten(order=‘C’) | 将数组的副本转换为一维数组,并返回。 |
np.ravel(a, order=‘C’) | 任意形状的数组扁平化,变为 1 维数组 |
import numpy as np
a = np.arange(6)
print("原数组是:",a)
b = a.reshape(3,2) # reshape改变数组尺寸
print("修改后的数组:","\n",b)
print (b.flatten()) # 使用flatten函数展开,[0 1 2 3 4 5]
print (b.ravel()) # 使用ravel函数展开,[0 1 2 3 4 5]
原数组是: [0 1 2 3 4 5]
修改后的数组:
[ [0 1]
[2 3]
[4 5] ]
[0 1 2 3 4 5]
[0 1 2 3 4 5]
注:a.reshape(newshape)或reshape(a,newshape)都可以完成reshape功能
函数 | 描述 |
---|---|
np.transpose() | 转置 |
np.swapaxes(a, axis1, axis2) | 交换轴 |
np.moveaxis(a, source, destination) | 轴移动 |
import numpy as np
arr = np.arange(6).reshape(1,2,3)
print ('原数组:','\n',arr) # 原数组是一个1x2x3的三维数组
arr_tp = np.transpose(arr)
print ('对换数组:','\n',arr_tp) # 经过交换转置后是3x2x1
arr_swap = np.swapaxes(arr, 0, 2)
print('交换轴之后:','\n',arr_swap) # 0和2轴交换,3x2x1
arr_move = np.moveaxis(arr, 0, -1)
print('移动轴之后:','\n',arr_move) # 0轴移到-1轴,2x3x1
原数组: # 1x2x3
[ [ [0 1 2]
[3 4 5] ] ]
对换数组:
[ [ [0]
[3]]
[[1]
[4]]
[[2]
[5] ] ]
交换轴之后:
[ [ [0]
[3]]
[[1]
[4]]
[[2]
[5] ] ]
移动轴之后:
[ [ [0]
[1]
[2]]
[[3]
[4]
[5] ] ]
more about transpose
:
import numpy as np
arr = np.arange(6).reshape(1,2,3)
print ('原数组:','\n',arr) # 原数组是一个1x2x3的三维数组
# 原数组的轴依次是0,1,2;现在要换轴2,1,0;则尺寸就是3x1x2
arr1 = arr.transpose(2,0,1)
print ('换轴之后:','\n',arr1)
"""
也可以用下面这种写法
arr2=np.transpose(arr,(2,0,1))
print(arr2)
"""
原数组:
[ [ [0 1 2]
[3 4 5] ] ]
换轴之后:
[ [ [0 3] ]
[ [1 4] ]
[ [2 5] ] ]
函数 | 描述 |
---|---|
np.concatenate((a1, a2, …), axis=0) | 将多个数组沿指定轴连接在一起 |
np.stack(arrays,axis) | 沿着新轴连接数组的序列 |
np.hstack() | 水平堆叠来生成数组 |
np.vstack() | 垂直堆叠来生成数组 |
import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
# 两个数组的维度相同
print ('沿轴 0 连接两个数组:')
print (np.concatenate((a,b)))
print ('沿轴 1 连接两个数组:')
print (np.concatenate((a,b),axis = 1))
沿轴 0 连接两个数组:
[[1 2]
[3 4]
[5 6]
[7 8]]
沿轴 1 连接两个数组:
[[1 2 5 6]
[3 4 7 8]]
函数 | 描述 |
---|---|
np.split(ary, indices_or_sections, axis) | 将数组拆分为多个子数组 |
np.hsplit(ary,indices_or_sections) | 将一个数组水平分割为多个子数组(按列) |
np.vsplit(ary,indices_or_sections) | 将一个数组垂直分割为多个子数组(按行) |
import numpy as np
a = np.arange(9)
print ('将数组分为三个大小相等的子数组:')
b = np.split(a,3)
print (b) # [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
import numpy as np
a = np.arange(4).reshape(2, 2)
print('第一个数组:','\n',a)
b = np.split(a,2) # 默认分割,按照0轴
print('默认分割(0轴):','\n',b)
c = np.split(a,2,1) # 按照1轴分割
print('沿水平方向分割:','\n',c)
d= np.hsplit(a,2)
print('沿水平方向分割:','\n',d)
第一个数组:
[[0 1]
[2 3]]
默认分割(0轴):
[array([[0, 1]]), array([[2, 3]])]
沿水平方向分割:
[array([[0],
[2]]), array([[1],
[3]])]
沿水平方向分割:
[array([[0],
[2]]), array([[1],
[3]])]
函数 | 描述 |
---|---|
np.resize(arr, shape) | 返回指定大小的新数组 |
np.append(arr, values, axis=None) | 在数组的末尾添加值 |
np.insert(arr, obj, values, axis)) | 沿给定轴在输入数组中插入值 |
np.delete(arr, obj, axis) | 返回从输入数组中删除指定子数组的新数组 |
np.random.rand(2, 5) # 生成0-1内2x5维度的随机数
array([ [0.04939478, 0.76997421, 0.68812704, 0.14582689, 0.70170358],
[0.78119438, 0.97073067, 0.43484078, 0.56556003, 0.03293409] ])
np.random.randn(1, 10)
array([[-0.12908575, 0.03111365, 2.21828821, 0.82484204, -0.70049814,
0.40385296, 0.57943472, 0.48817047, 1.60132259, 0.05599768]])
x=np.random.randint(2,size=5) # 0-2之间的一维数组1x5
y=np.random.randint(1,5,size=(2,3)) # 1-5之间的2x3二维数组
print(x) # [0 0 1 1 0]
print(y)
输出:
[0 0 1 1 0]
[ [3 2 1]
[2 4 3] ]
x = np.random.choice(10, 3) # 从range(10)随机抽取3个数
arr = [1,5,10,-3,6,7]
y = np.random.choice(arr,5) # 从数组中随机抽取5个数
print(x) # [2 6 1]
print(y) # [-3 10 -3 5 1]
函数 | 分布 | 描述 |
---|---|---|
np.random.binomial(n, p, size=None) | 二项分布 | size表示采样的次数,n表示做了n重伯努利试验,p表示成功的概率,函数的返回值表示n中成功的次数 |
np.random.poisson(lam=1.0, size=None) | 泊松分布 | size表示采样的次数,lam表示一个单位内发生事件的平均值,函数的返回值表示一个单位内事件发生的次数 |
np.random.geometric(p,size) | 几何分布 | size表示采样次数,p表示成功的概率 |
函数 | 分布 | 描述 |
---|---|---|
np.random.normal(loc,scale,size) | 正态分布 | 创建均值为 loc(mu),标准差为 scale(sigma),大小为 size 的数组。 |
np.random.uniform(low=0.0, high=1.0, size=None) | 均匀分布 | 在low到high范围内,创建大小为size的均匀分布的随机数 |
np.random.exponential(scale=1.0, size=None) | 指数分布 | scale = 1 λ \frac {1} {\lambda} λ1 |
具体参见官方文档.
参考链接:
https://www.lanqiao.cn/courses/912/learning/
https://www.runoob.com/numpy/numpy-tutorial.html
https://tianchi.aliyun.com/course/323/3639
比较详细的教程:
Numpy入门详细教程