美文网首页
初识Numpy

初识Numpy

作者: 元宝的技术日常 | 来源:发表于2020-04-12 22:27 被阅读0次

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]

\color{#4285f4}{Python的List不要求存储同样的类型,带来效率问题。接下来看看array可以解决吗?}


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

\color{#4285f4}{array要求存储同样的类型,缺点是没有将数据当做向量或者矩阵,不支持基本运算。}


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

\color{#4285f4}{numpy.array要求存储同样的类型,把数据当做向量或者矩阵,支持基本运算。}

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]])

相关文章

  • 初识Numpy

    1、 为什么要在第一篇写Numpy? 做机器学习、深度学习的项目,不可避免地要和数据打交道。这些数据怎么能方便、快...

  • NumPy数组(初识numpy数组)

    NumPy 是一个基础性的Python库,为我们提供了常用的数值数组和函数 安装 一个简单的应用 假设要对向量a和...

  • numpy数组初识

    1、numpy数组共享内存,若独立保存,需显示备份。如图1: 2 、数组计算 a、数组与标量计算,直接把数组里的元...

  • 初识SciPy、NumPy

    目的 尝试编程fox-li数值迭代法求解条形腔的激光光场模式分布,学习使用scipy、numpy甚至是matplo...

  • Numpy之初识ndarray

    Numpy ndarray numpy的最重要特点就是其N维数组对象(ndarray)。 ndarray的可以对整...

  • 完成 初识Numpy小章节

    今天进行到Part 2 Data Visualisation and analysis.首个章节是关于Numpy入...

  • python之股票数据分析

    一、初识Pandas Pandas 是基于 NumPy 的一个非常好用的库,它有两种自己独有的基本数据结构Seri...

  • python数据分析(一) numpy 初识

    一、NumPy 是什么 NumPy 是 Python 科学计算的基础包,它专为进行严格的数字处理而产生,它提供了:...

  • 科学计算库numpy的执行示例

    numpy1 numpy2 numpy3 numpy4

  • numpy中的常量

    Constants 正无穷 numpy.inf numpy.Inf numpy.Infinity numpy.in...

网友评论

      本文标题:初识Numpy

      本文链接:https://www.haomeiwen.com/subject/cdtumhtx.html