1、 为什么要在第一篇写Numpy?
做机器学习、深度学习的项目,不可避免地要和数据打交道。这些数据怎么能方便、快速地达到期望的数学结果,成为了能训练出一个好的模型的基本。
之前听过亚马逊的李沐工程师介绍过亚马逊的MXNet,说到该框架很大程度也是再优化这方面的工作。而Google的TensorFlow,翻译成中文是“数据流图”,图的节点是数据操作,图的线是数据的流向。
Numpy能解决一些这样的问题。怎么解决的呢?这次会从使用的角度来初识Numpy。此次的思路是按照bobo老师的机器学习课程,之后方便时,从源码方面再进一步探究Numpy。
2、 初识Numpy
2-1、版本
import numpy as np
np.__version__
# '1.16.3'
本次是基于 1.16.3版本,如果再重现代码时效果发生偏差,请按照这个版本进行调整。
2-2、numpy.array 基础
2-2-1、Python List的特点
L = [i for i in range(10)] #列表表达式
L
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 取出L 的第六个元素,因为索引从0开始,即为L[5]
L[5]
# 5
# 为L 的第六个元素重新赋值
L[5] = 100
L
# [0, 1, 2, 3, 4, 100, 6, 7, 8, 9]
# 为L 的第六个元素重新赋值
L[5] = "Machine Learning"
L
# [0, 1, 2, 3, 4, 'Machine Learning', 6, 7, 8, 9]
2-2-2、array
import array
arr = array.array('i', [i for i in range(10)]) #指定存储元素类型为整型
arr
# array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 取出arr 的第六个元素,因为索引从0开始,即为L[5]
arr[5]
# 5
# 为arr 的第六个元素重新赋值
arr[5] = 100
arr
# array('i', [0, 1, 2, 3, 4, 100, 6, 7, 8, 9])
# 如果在array中添加的元素不为整型,则开始报错
arr[5] = "Machine Learning"
arr[5] = 5.0
2-2-3、numpy.array
nparr = np.array([i for i in range(10)])
nparr
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
nparr.dtype # 添加的元素类型只有整型的话,默认为int32型
# dtype('int32')
# 为arr 的第六个元素重新赋值
nparr[5] = 100
nparr
# array([ 0, 1, 2, 3, 4, 100, 6, 7, 8, 9])
# 如果在array中添加的元素不为整型,则开始报错
nparr[5] = "Machine Learning"
# 如果在array中添加的元素不为整型,但元素类型为float,则会将该元素转换为整数再添加
nparr[5] = 5.0
nparr[5]
# 5
nparr[5] = 3.14
nparr[5]
# 3
Python中提供了list容器,可以当作数组使用。但列表中的元素可以是任何对象,因此列表中保存的是对象的指针,这样一来,为了保存一个简单的列表[1,2,3]。就需要三个指针和三个整数对象。对于数值运算来说,这种结构显然不够高效。
Python虽然也提供了array模块,但其只支持一维数组,不支持多维数组(在TensorFlow里面偏向于矩阵理解),也没有各种运算函数。因而不适合数值运算。
NumPy的出现弥补了这些不足。
——摘自张若愚的《Python科学计算》
2-3、创建 numpy.array
2-3-1、常规创建方法
nparr = np.array([i for i in range(10)])
nparr
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
nparr.dtype # 添加的元素类型只有整型的话,默认为int32型
# dtype('int32')
b = np.array([2.0,3.0,4.0])
b
# [2. 3. 4.]
b.dtype # 添加的元素类型有float型的话,默认为float64型
# dtype('float64')
2-3-2、其他创建的方法
np.zeros((3,4)) # 3行,4列,全0
#array([[0., 0., 0., 0.],
# [0., 0., 0., 0.],
# [0., 0., 0., 0.]])
np.zeros(10, dtype=int) # 全0, 指定数据类型为整型
# array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
np.ones((3,5),dtype=np.int16) # 3行,5列,全1
#array([[1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1.]])
np.full((3, 5), 666.0) ## 3行,5列,全666,浮点型
#array([[666., 666., 666., 666., 666.],
# [666., 666., 666., 666., 666.],
# [666., 666., 666., 666., 666.]])
np.arange(0,10,2) # 起点为0,不超过10,步长为2
# array([0, 2, 4, 6, 8])
np.linspace(-1,2,5) # 起点为-1,终点为2,取5个点
# array([-1. , -0.25, 0.5 , 1.25, 2. ])
np.random.randint(0, 10, size=(3,5)) # 大于等于0,小于10,3行5列的随机整数
# array([[7, 9, 8, 8, 3],
# [3, 1, 4, 4, 6],
# [4, 3, 0, 8, 6]])
np.random.normal(0, 1, (3, 5)) #均值为0,方差为1的正太分布中,取3行5列的随机数
# array([[ 1.16904559, 0.28771781, -0.36423435, -0.37977529, -0.76225455],
# [ 1.00637566, -0.89150273, 0.30799584, -0.09524158, 0.71760026],
# [ 1.8007584 , 0.03185503, 0.44137726, -0.71896076, 0.92777846]])
numpy.random.seed(666) # 如果每次生成的随机数相同,可以设置随机种子
2-4、numpy.array 基本操作
# 创建两个numpy.array x1、x2
x1 = np.arange(10)
x1
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x2 = np.arange(15).reshape((3, 5))
x2
# array([[ 0, 1, 2, 3, 4],
# [ 5, 6, 7, 8, 9],
# [10, 11, 12, 13, 14]])
2-4-1、numpy.array 的基本属性
x1.ndim # x的维度
# 1
x2.ndim # X的维度
# 2
x1.shape # x的形状,一维向量
# (10,)
x2.shape # X的形状,二维矩阵
# (3, 5)
x1.size # x的元素个数
# 10
x2.size # X的元素个数
# 15
2-4-2、numpy.array 的数据访问
x1
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x1[0] # 访问第一个元素
# 0
x1[-1] # 访问最后一个元素
# 9
x1[0:5] # 取前5个元素,区间范围是[0,5)
# array([0, 1, 2, 3, 4])
x1[:5] # 取前5个元素,区间范围是[0,5)
# array([0, 1, 2, 3, 4])
x1[5:] # 取后5个元素,区间范围是[5,10)
# array([0, 1, 2, 3, 4])
x1[::2] # 从第一个元素开始,每隔1个元素取出
# array([0, 2, 4, 6, 8])
x1[1::2] # 从第二个元素开始,每隔1个元素取出
# array([1, 3, 5, 7, 9])
x1[::-1] # 逆序
# array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
x2
# array([[ 0, 1, 2, 3, 4],
# [ 5, 6, 7, 8, 9],
# [10, 11, 12, 13, 14]])
x2[0][0] # 不建议!在numpy中使用","做多维索引
# 0
x2[0, 0] # 第一行的第一个元素
# 0
x2[0, -1] # 第一行的最后一个元素
# 0
x2[:2, :3] # 头两行的前三列元素
# array([[0, 1, 2],
# [5, 6, 7]])
x2[:2][:3] # 结果不一样,在numpy中使用","做多维索引
# array([[0, 1, 2, 3, 4],
# [5, 6, 7, 8, 9]])
x2[:2] # 取出前两行的所有列
# array([[0, 1, 2, 3, 4],
# [5, 6, 7, 8, 9]])
x2[:2, ::2] # 取出前两行的从第一列开始每隔一列元素
# array([[0, 2, 4],
# [5, 7, 9]])
x2[::-1, :] #行做逆操作,列不变
#array([[14, 13, 12, 11, 10],
# [ 9, 8, 7, 6, 5],
# [ 4, 3, 2, 1, 0]])
2-4-3、Subarray of numpy.array
subX = x2[:2, :3]
subX
# array([[0, 1, 2],
# [5, 6, 7]])
subX[0, 0] = 100 # 虽然赋值在subX上,但作用的还是原矩阵-x2
subX
# array([[100, 1, 2],
# [ 5, 6, 7]])
x2
# array([[100, 1, 2, 3, 4],
# [ 5, 6, 7, 8, 9],
# [ 10, 11, 12, 13, 14]])
x2[0, 0] = 0
x2
# array([[ 0, 1, 2, 3, 4],
# [ 5, 6, 7, 8, 9],
# [10, 11, 12, 13, 14]])
subX
# array([[0, 1, 2],
# [5, 6, 7]])
subX = X[:2, :3].copy() # copy后才真正的属于subX
subX[0, 0] = 100
subX
# array([[100, 1, 2],
# [ 5, 6, 7]])
x2
# array([[ 0, 1, 2, 3, 4],
# [ 5, 6, 7, 8, 9],
# [10, 11, 12, 13, 14]])
2-4-4、Reshape
x.shape
# (10,)
x.ndim
# 1
x.reshape(2, 5) # 将原来的向量转换为 2行5列的矩阵
# array([[0, 1, 2, 3, 4],
# [5, 6, 7, 8, 9]])
x
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
A = x.reshape(2, 5)
A
# array([[0, 1, 2, 3, 4],
# [5, 6, 7, 8, 9]])
x
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
B = x.reshape(1, 10)
B
# array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
B.ndim
# 2
B.shape
# (1, 10)
C = x.reshape(1, -1) # -1 代表x-未知数,最终改变为(1,x)
C
# array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
2-5、numpy.array 合并和分割
2-5-1、numpy.array 的合并
x = np.array([1, 2, 3])
y = np.array([3, 2, 1])
np.concatenate([x, y]) #向量拼接
# array([1, 2, 3, 3, 2, 1])
z = np.array([666, 666, 666])
np.concatenate([x, y, z]) #向量拼接
# array([ 1, 2, 3, 3, 2, 1, 666, 666, 666])
A = np.array([[1, 2, 3],
[4, 5, 6]])
np.concatenate([A, A]) # 默认在矩阵的第一个维度拼接,即行上
# array([[1, 2, 3],
# [4, 5, 6],
# [1, 2, 3],
# [4, 5, 6]])
np.concatenate([A, A], axis=1) # 指定在矩阵的第二个维度拼接,即列上
# array([[1, 2, 3, 1, 2, 3],
# [4, 5, 6, 4, 5, 6]]
np.concatenate([A, z]) # 矩阵和向量不能直接合并
# error
z.shape #一维向量
# (3,)
z.reshape(1, -1).shape #二维矩阵
# (1, 3)
np.concatenate([A, z.reshape(1, -1)]) # 默认在矩阵的第一个维度拼接,即行上
# array([[ 1, 2, 3],
# [ 4, 5, 6],
# [666, 666, 666]])
np.vstack([A, z]) # 矩阵和向量在第一个维度拼接,即行上
# array([[ 1, 2, 3],
# [ 4, 5, 6],
# [666, 666, 666]])
B = np.full((2,2), 100)
np.hstack([A, B]) # 在第二个维度拼接,即列上
# array([[ 1, 2, 3, 100, 100],
# [ 4, 5, 6, 100, 100]])
2-5-2、numpy.array 的分割
x = np.arange(10)
x
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x1, x2, x3 = np.split(x, [3, 4]) #分成3部分 [0,3) [3,4) [4,10)
x1
# array([0, 1, 2])
x2
# array([3])
x3
# array([4, 5, 6, 7, 8, 9])
x1, x2 = np.split(x, [5]) # #分成2部分 [0,5) [5,10)
x1
# array([0, 1, 2, 3, 4]
x2
# array([5, 6, 7, 8, 9]
A = np.arange(16).reshape((4, 4))
A
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11],
# [12, 13, 14, 15]])
A1, A2 = np.split(A, [2]) # 按行分割 [0,2) [2,4)
A1
# array([[0, 1, 2, 3],
# [4, 5, 6, 7]])
A2
# array([[ 8, 9, 10, 11],
# [12, 13, 14, 15]])
A1, A2 = np.split(A, [2], axis=1) # 按列分割 [0,2) [2,4)
A1
# array([[ 0, 1],
# [ 4, 5],
# [ 8, 9],
# [12, 13]])
A2
# array([[ 2, 3],
# [ 6, 7],
# [10, 11],
# [14, 15]])
upper, lower = np.vsplit(A, [2]) # 按行分割 [0,2) [2,4)
upper
# array([[0, 1, 2, 3],
# [4, 5, 6, 7]])
lower
# array([[ 8, 9, 10, 11],
# [12, 13, 14, 15]])
left, right = np.hsplit(A, [2]) # 按列分割 [0,2) [2,4)
left
# array([[ 0, 1],
# [ 4, 5],
# [ 8, 9],
# [12, 13]])
right
# array([[ 2, 3],
# [ 6, 7],
# [10, 11],
# [14, 15]])
data = np.arange(16).reshape((4, 4))
data
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11],
# [12, 13, 14, 15]])
X, y = np.hsplit(data, [-1]) # 按列分割 [0,-1) [3,4)
X
# array([[ 0, 1, 2],
# [ 4, 5, 6],
# [ 8, 9, 10],
# [12, 13, 14]])
y
# array([[ 3],
# [ 7],
# [11],
# [15]])
2-6、numpy.array 中的运算
2-6-1、元素运算
X = np.arange(1, 16).reshape((3, 5))
X
# array([[ 1, 2, 3, 4, 5],
# [ 6, 7, 8, 9, 10],
# [11, 12, 13, 14, 15]])
X + 1
# array([[ 2, 3, 4, 5, 6],
# [ 7, 8, 9, 10, 11],
# [12, 13, 14, 15, 16]])
X - 1
# array([[ 0, 1, 2, 3, 4],
# [ 5, 6, 7, 8, 9],
# [10, 11, 12, 13, 14]])
X * 2
# array([[ 2, 4, 6, 8, 10],
# [12, 14, 16, 18, 20],
# [22, 24, 26, 28, 30]])
X / 2
# array([[0.5, 1. , 1.5, 2. , 2.5],
# [3. , 3.5, 4. , 4.5, 5. ],
# [5.5, 6. , 6.5, 7. , 7.5]])
X // 2 #除完2 结果向下取整
# array([[0, 1, 1, 2, 2],
# [3, 3, 4, 4, 5],
# [5, 6, 6, 7, 7]], dtype=int32)
X ** 2
# array([[ 1, 4, 9, 16, 25],
# [ 36, 49, 64, 81, 100],
# [121, 144, 169, 196, 225]], dtype=int32)
X % 2 # 除2后的余数
# array([[1, 0, 1, 0, 1],
# [0, 1, 0, 1, 0],
# [1, 0, 1, 0, 1]], dtype=int32)
1 / X
# array([[1. , 0.5 , 0.33333333, 0.25 , 0.2 ],
# [0.16666667, 0.14285714, 0.125 , 0.11111111, 0.1 ],
# [0.09090909, 0.08333333, 0.07692308, 0.07142857, 0.06666667]])
np.abs(X) #绝对值
# array([[ 1, 2, 3, 4, 5],
# [ 6, 7, 8, 9, 10],
# [11, 12, 13, 14, 15]])
np.sin(X)
#array([[ 0.84147098, 0.90929743, 0.14112001, -0.7568025 , -0.95892427],
# [-0.2794155 , 0.6569866 , 0.98935825, 0.41211849, -0.54402111],
# [-0.99999021, -0.53657292, 0.42016704, 0.99060736, 0.65028784]])
np.exp(X) # e的幂次方
# array([[2.71828183e+00, 7.38905610e+00, 2.00855369e+01, 5.45981500e+01,
# 1.48413159e+02],
# [4.03428793e+02, 1.09663316e+03, 2.98095799e+03, 8.10308393e+03,
# 2.20264658e+04],
# [5.98741417e+04, 1.62754791e+05, 4.42413392e+05, 1.20260428e+06,
# 3.26901737e+06]])
np.exp2(X) # 2的幂次方
# array([[2.0000e+00, 4.0000e+00, 8.0000e+00, 1.6000e+01, 3.2000e+01],
# [6.4000e+01, 1.2800e+02, 2.5600e+02, 5.1200e+02, 1.0240e+03],
# [2.0480e+03, 4.0960e+03, 8.1920e+03, 1.6384e+04, 3.2768e+04]])
np.power(3, X) #每个元素求3次方
#array([[ 3, 9, 27, 81, 243],
# [ 729, 2187, 6561, 19683, 59049],
# [ 177147, 531441, 1594323, 4782969, 14348907]], dtype=int32)
np.log(X) # e为底的对数
# array([[0. , 0.69314718, 1.09861229, 1.38629436, 1.60943791],
# [1.79175947, 1.94591015, 2.07944154, 2.19722458, 2.30258509],
# [2.39789527, 2.48490665, 2.56494936, 2.63905733, 2.7080502 ]])
2-6-2、矩阵运算
A = np.arange(4).reshape(2, 2)
A
# array([[0, 1],
# [2, 3]])
B = np.full((2, 2), 10)
B
# array([[10, 10],
# [10, 10]])
A + B
# array([[10, 11],
# [12, 13]])
A - B
# array([[-10, -9],
# [ -8, -7]])
A * B
# array([[ 0, 10],
# [20, 30]])
A.dot(B) # A和B点积
# array([[10, 10],
# [50, 50]])
A.T # A的转置
# array([[0, 2],
# [1, 3]])
2-6-3、向量和矩阵的运算
A = np.arange(4).reshape(2, 2)
A
# array([[0, 1],
# [2, 3]])
v = np.array([1, 2])
v
# array([1, 2])
v + A # 加法
# array([[1, 3],
# [3, 5]])
[v] * A.shape[0]
# [array([1, 2]), array([1, 2])]
np.vstack([v] * A.shape[0])
# array([[1, 2],
# [1, 2]])
np.tile(v, (1, 2)) # (1, 2) 行-axis=0 扩大为原来的1倍,即为不变
# 列-axis=1 扩大为原来的两倍,即复制一份后变为矩阵
# array([[1, 2, 1, 2]])
np.tile(v, (2, 1))
# array([[1, 2],
# [1, 2]])
np.tile(v, (2, 2))
# array([[1, 2, 1, 2],
# [1, 2, 1, 2]])
v * A
# array([[0, 2],
# [2, 6]])
v.dot(A)
# array([4, 7])
A.dot(v)
# array([2, 8])
a1 = np.array([1, 2, 3])
a2 = np.arange(9).reshape(3, 3)
a2.dot(a1) # a2 点乘 a1的转置后 结果再转置
# array([ 8, 26, 44])
2-6-4、矩阵的逆
A = np.arange(4).reshape(2, 2)
A
# array([[0, 1],
# [2, 3]])
np.linalg.inv(A)
A.dot(invA)
# array([[1., 0.],
# [0., 1.]])
invA.dot(A)
# array([[1., 0.],
# [0., 1.]])
X = np.arange(16).reshape((2, 8))
invX = np.linalg.inv(X) #矩阵不是方阵,就会出现错误,可以用下边的伪逆
# error
pinvX = np.linalg.pinv(X) # 伪逆
pinvX
# array([[-1.35416667e-01, 5.20833333e-02],
# [-1.01190476e-01, 4.16666667e-02],
# [-6.69642857e-02, 3.12500000e-02],
# [-3.27380952e-02, 2.08333333e-02],
# [ 1.48809524e-03, 1.04166667e-02],
# [ 3.57142857e-02, -1.04083409e-17],
# [ 6.99404762e-02, -1.04166667e-02],
# [ 1.04166667e-01, -2.08333333e-02]])
X.dot(pinvX)
# array([[ 1.00000000e+00, -2.49800181e-16],
# [ 0.00000000e+00, 1.00000000e+00]])
2-7、Numpy 中的聚合操作
2-7-1、sum\min\max
L = np.random.random(100)
np.sum(L)
np.min(L)
np.max(L)
2-7-2、多维度聚合
X = np.arange(16).reshape(4,-1)
X
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11],
# [12, 13, 14, 15]])
np.sum(X)
# 120
np.sum(X, axis=0) # 注意:axis描述的是将要被压缩的维度
# array([24, 28, 32, 36])
np.sum(X, axis=1)
# array([ 6, 22, 38, 54])
2-7-3、其他聚合操作
X = np.arange(16).reshape(4,-1)
X
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11],
# [12, 13, 14, 15]])
np.prod(X) #计算所有元素的乘积
# 0
np.prod(X + 1)
# 2004189184
np.mean(X)
# 7.5
np.median(X) # 中位数
# 7.5
np.percentile(X, q=50) #百分位
# 7.5
np.std(X) #标准差
# 4.6097722286464435
np.var(X) #方差
# 21.25
2-8、Numpy 中arg运算
2-8-1、索引
x = np.random.normal(0, 1, 1000000)
np.argmin(x) # 最小值的索引值
# 138382
x[138382]
# -4.3695513384403055
np.min(x)
# -4.3695513384403055
np.argmax(x) # 最大值的索引值
# 106788
x[106788]
#4.635363975649552
np.max(x)
# 4.635363975649552
2-8-2、排序
x = np.arange(16)
x
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
np.random.shuffle(x)
x
# array([ 3, 4, 0, 11, 8, 14, 7, 9, 10, 12, 2, 1, 5, 13, 15, 6])
np.sort(x)
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
x
# array([ 3, 4, 0, 11, 8, 14, 7, 9, 10, 12, 2, 1, 5, 13, 15, 6])
x.sort()
x
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
X = np.random.randint(10, size=(4,4))
X
# array([[5, 6, 7, 0],
# [2, 7, 1, 3],
# [8, 9, 6, 4],
# [0, 1, 2, 1]])
np.sort(X, axis=0)
# array([[0, 1, 1, 0],
# [2, 6, 2, 1],
# [5, 7, 6, 3],
# [8, 9, 7, 4]])
np.sort(X, axis=1)
# array([[0, 5, 6, 7],
# [1, 2, 3, 7],
# [4, 6, 8, 9],
# [0, 1, 1, 2]])
2-8-3、使用索引
x = np.arange(16)
x
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
np.random.shuffle(x)
x
# array([ 9, 11, 15, 4, 6, 7, 14, 0, 13, 3, 10, 8, 2, 5, 12, 1])
np.argsort(x) #排序后的索引值
# array([ 7, 15, 12, 9, 3, 13, 4, 5, 11, 0, 10, 1, 14, 8, 6, 2],
# dtype=int64)
np.partition(x, 5) # 以第6个元素为分割点
# array([ 0, 1, 4, 2, 3, 5, 12, 9, 7, 6, 10, 8, 11, 13, 14, 15])
np.argpartition(x, 5) # 以第6个元素为分割点的索引值
# array([ 7, 15, 3, 12, 9, 13, 14, 0, 5, 4, 10, 11, 1, 8, 6, 2],
# dtype=int64)
X = np.random.randint(10, size=(4,4))
X
# array([[5, 6, 7, 0],
# [2, 7, 1, 3],
# [8, 9, 6, 4],
# [0, 1, 2, 1]])
np.argsort(X, axis=1)
# array([[3, 0, 1, 2],
# [2, 0, 3, 1],
# [3, 2, 0, 1],
# [0, 1, 3, 2]], dtype=int64)
np.argpartition(X, 2, axis=1)
# array([[3, 0, 1, 2],
# [2, 0, 3, 1],
# [3, 2, 0, 1],
# [0, 1, 3, 2]], dtype=int64)
2-9、Numpy 中的比较和Fancy Indexing
2-9-1、Fancy Indexing
x = np.arange(16)
x
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
x[3]
# 3
x[3:9] # 截取 [3,9)
# array([3, 4, 5, 6, 7, 8])
x[3:9:2] # 截取 [3,9) 后 取每隔两个数
# array([3, 5, 7])
[x[3], x[5], x[7]]
# [3, 5, 7]
ind = [3, 5, 7]
x[ind]
# array([3, 5, 7])
ind = np.array([[0, 2], [1, 3]])
x[ind]
# array([[0, 2],
# [1, 3]])
A = x.reshape(4, -1)
A
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11],
# [12, 13, 14, 15]])
row = np.array([0, 1, 2])
col = np.array([1, 2, 3])
A[row, col] # 矩阵中先取前三行 再按行取第二个、第三个、第四个元素
# array([ 1, 6, 11])
A[0, col]
# array([1, 2, 3])
A[:2, col]
# array([[1, 2, 3],
# [5, 6, 7]])
col = [True, False, True, True]
A[0, col]
# array([0, 2, 3])
2-9-2、numpy.array 的比较
x = np.arange(16)
x
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
x < 3
# array([ True, True, True, False, False, False, False, False, False,
# False, False, False, False, False, False, False])
x > 3
# array([False, False, False, False, True, True, True, True, True,
# True, True, True, True, True, True, True])
x <= 3
# array([ True, True, True, True, False, False, False, False, False,
# False, False, False, False, False, False, False])
x >= 3
# array([False, False, False, True, True, True, True, True, True,
# True, True, True, True, True, True, True])
x == 3
# array([False, False, False, True, False, False, False, False, False,
# False, False, False, False, False, False, False])
x != 3
# array([ True, True, True, False, True, True, True, True, True,
# True, True, True, True, True, True, True])
2 * x == 24 - 4 * x
# array([False, False, False, False, True, False, False, False, False,
# False, False, False, False, False, False, False])
2-9-3、使用 numpy.array 的比较结果
x = np.arange(16)
x
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
A = x.reshape(4, -1)
A
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11],
# [12, 13, 14, 15]])
np.count_nonzero( x <= 3)
# 4
np.sum(x <= 5) # 小于等于5的元素有几个
# 6
x <= 5
# array([ True, True, True, True, True, True, False, False, False,
# False, False, False, False, False, False, False])
A % 2 == 0
# array([[ True, False, True, False],
# [ True, False, True, False],
# [ True, False, True, False],
# [ True, False, True, False]])
np.sum(A % 2 == 0, axis=0) # X % 2 == 0 :可以整除2的元素为True ;
# 按行统计最后结果,即一列有几个True
# array([4, 0, 4, 0])
np.sum(A % 2 == 0, axis=0) # X % 2 == 0 :可以整除2的元素为True ;
# 按列统计最后结果,即一行有几个True
# array([2, 2, 2, 2])
np.any(x == 0) #有一个符合条件就行
# True
np.any(x < 0)
# False
np.all(x > 0) #所有符合条件才行
# False
np.all(x >= 0)
# True
np.all(A > 0, axis=1)
# array([False, True, True, True])
np.sum((x > 3) & (x < 10)) #x中 大于3小于10的元素有多少个
# 6
np.sum((x % 2 == 0) | (x > 10))
# 11
np.sum(~(x == 0)) #非运算
# 15
x[x < 5]
# array([0, 1, 2, 3, 4])
x[x % 2 == 0]
# array([ 0, 2, 4, 6, 8, 10, 12, 14])
A[A[:,3] % 3 == 0, :]
# array([[ 0, 1, 2, 3],
# [12, 13, 14, 15]])
网友评论