Nemo
Nemo
Numpy语法总结
Numpy语法总结

Numpy介绍

numpy支持大量高维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

知识点

  • 创建数组
  • 数组运算
  • 数学函数
  • 数组的切片和索引
  • 数组形状操作
  • 数组排序
  • 数组统计

基础操作

1.查看Numpy版本号

print(np.__version__)

2.创建数组

NumPy 的主要对象是多维数组 Ndarray在 NumPy 中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。例如,下方数组是一个为 1 的数组,因为它只有一个轴 (行),而轴的长度为 3。

[1,2,3]

又例如,下方数组的为2 (一行和一列)。第一个维度长度为2 (行) ,第二个维度长度为 3 (列)

[[1., 2., 3.],
[4., 5., 6.]]

2.1 通过列表创建一维数组

注意:numpy.array 和 Python 标准库 array.array 并不相同,前者更为强大,这也就是我们学习 Numpy 的重要原因之一。

输入:

np.array([1, 2, 3])

输出:

array([1, 2, 3])

2.2 通过列表创建二维数组

输入:

np.array([(1, 2, 3), (4, 5, 6)]) #注意这里的是(1, 2, 3), (4, 5, 6),不要忘记括号!

输出:

array([[1, 2, 3],
       [4, 5, 6]])

2.3 创建全为0的二维数组

输入:

np.zeros((3, 3))

输出:

array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

2.4 创建全为 1 的三维数组(好好理解)

输入:

np.ones((2, 3, 4)) 

输出:

array([[[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]],

       [[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]]])

2.5 创建一维等差数组

输入:

np.arange(5)

输出:

array([0, 1, 2, 3, 4])

2.6创建二维等差数组

输入:

np.arange(6).reshape(2, 3)

.reshape(2, 3) 把一维数组变成两行三列

输出:

array([[0, 1, 2],
       [3, 4, 5]])

2.7 创建单位矩阵

输入:

np.eye(3)

输出:

array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

2.8 创建间隔一维数组

输入:

np.linspace(1, 10, num=6)

输出:

array([ 1. ,  2.8,  4.6,  6.4,  8.2, 10. ])

2.9创建二维随机数组

输入:

np.random.rand(2, 3) #两行三列

输出:

array([[0.50122984, 0.98824375, 0.81388012],
       [0.60951775, 0.02055326, 0.97622093]])

2.10 创建二维随机整数数组(数值小于 5)

输入:

np.random.randint(5, size=(2, 3))

输出:

array([[2, 0, 2], 
      [4, 4, 4]])

2.11 依据自定义函数创建数组

输入:

np.fromfunction(lambda i, j: i + j, (3, 3))  # i,j都是从0开始

输出:

array([[0., 1., 2.],
       [1., 2., 3.],
       [2., 3., 4.]])

3.数组运算

3.1 一维数组的四则运算

生成一维示例数组:
输入:

a = np.array([10, 20, 30, 40, 50])
b = np.arange(1, 6)
a, b

输出:

(array([10, 20, 30, 40, 50]), array([1, 2, 3, 4, 5]))

输入:

a + b
a - b
a * b
a / b

输出:

array([11, 22, 33, 44, 55])
array([ 9, 18, 27, 36, 45])
array([ 10,  40,  90, 160, 250])
array([10., 10., 10., 10., 10.])

3.2 二维数组(矩阵)运算

生成二维示例数组(可以看作矩阵)

输入:

A = np.array([[1, 2],
              [3, 4]])
B = np.array([[5, 6],
              [7, 8]])
A, B

输出:

(array([[1, 2],
        [3, 4]]), array([[5, 6],
        [7, 8]]))

3.2.1矩阵的加减法

输入:

A + B
A - B

输出:

array([[ 6,  8],
       [10, 12]])

array([[-4, -4],
       [-4, -4]])

3.2.2 矩阵==元素间==乘法运算

输入:

A * B

输出:

array([[ 5, 12],
       [21, 32]])

3.2.3 矩阵==乘法==运算(注意与上题的区别)

输入:

np.dot(A, B)

输出:

array([[19, 22],
       [43, 50]])

如果使用 np.mat 将二维数组准确定义为矩阵,就可以直接使用 * 完成矩阵乘法计算。

输入:

np.mat(A) * np.mat(B)

输出:

matrix([[19, 22],
        [43, 50]])

3.2.3 矩阵的数乘

输入:

2 * A

输出:

array([[2, 4],
       [6, 8]])

3.3矩阵的转置、求逆

输入:

A.T

输出:

array([[1, 3],
       [2, 4]])

输入:

np.linalg.inv(A)

输出:

array([[-2. ,  1. ],
       [ 1.5, -0.5]])

4.数学函数

4.1三角函数

输入:

print(a)

np.sin(a)

输出:

[10 20 30 40 50]

array([-0.54402111,  0.91294525, -0.98803162,  0.74511316, -0.26237485])

4.2以自然对数函数为底数的指数函数

输入:

np.exp(a)

输出:

array([2.20264658e+04, 4.85165195e+08, 1.06864746e+13, 2.35385267e+17,
       5.18470553e+21])

4.3 数组的方根的运算(开平方)

输入:

np.sqrt(a)

输出:

array([3.16227766, 4.47213595, 5.47722558, 6.32455532, 7.07106781])

4.4 数组的方根的运算(立方)

输入:

np.power(a, 3)

输出:

array([  1000,   8000,  27000,  64000, 125000])

5.数组的切片和索引

5.1 一维数组的索引

输入:

a = np.array([1, 2, 3, 4, 5])
a[0], a[-1]

输出:

(1, 5)   

索引出来成元组形式了

5.2 一维数组的切片

输入:

a[0:2], a[:-1]

输出:

(array([1, 2]), array([1, 2, 3, 4]))

5.3 二维数组索引(对行进行索引)

输入:

a = np.array([(1, 2, 3), (4, 5, 6), (7, 8, 9)])
a[0], a[-1]

输出:

(array([1, 2, 3]), array([7, 8, 9]))

二维数组的单个索引是索引的行

5.4 二维数组切片(取出第2列)

输入:

print(a)

a[:, 1]

输出:

[[1 2 3]
 [4 5 6]
 [7 8 9]]

array([2, 5, 8])

操作数==行在前、列在后==

5.5 二维数组切片(取出第2,3行)
输入:

a[1:3, :]

输出:

array([[4, 5, 6],
       [7, 8, 9]])

操作数==行在前、列在后==,切片符号‘:’

6.数组形状操作

生成二维示例数组

输入:

a = np.random.random((3, 2))
a

输出:

array([[0.04350254, 0.71580656],
       [0.52073605, 0.70767743],
       [0.60271726, 0.42957689]])

np.random.random( (x,y) ) 表示生成x行,y列范围在0~1之间的随机数矩阵。
link

6.1 查看数组形状

输入:

a.shape

输出:

(3, 2)

6.2 输出改变的数组形状(不改变原始数组)

输入:

a
a.reshape(2, 3)

==reshape== 并不改变原始数组

输出:

[[0.04350254 0.71580656]
 [0.52073605 0.70767743]
 [0.60271726 0.42957689]]

array([[0.04350254, 0.71580656, 0.52073605],
       [0.70767743, 0.60271726, 0.42957689]])

注意reshape改变数组形状的补齐方式

6.3 更改数组形状(改变原始数组)

输入:

a.resize(2, 3)
a

输出:

array([[0.04350254, 0.71580656, 0.52073605],
       [0.70767743, 0.60271726, 0.42957689]])

6.3 展平数组

输入:

a.ravel()

输出:

array([0.04350254, 0.71580656, 0.52073605, 0.70767743, 0.60271726,
       0.42957689])

7.拼接拆分数组

生成示例数组

输入:

a = np.random.randint(10, size=(3, 3))
b = np.random.randint(10, size=(3, 3))

a, b

输出:

(array([[8, 6, 4],
        [0, 0, 4],
        [6, 5, 4]]), 

 array([[2, 7, 1],
        [3, 8, 2],
        [7, 8, 4]]))

np.random.randint(n,size=(x,y)) 表示生成x行y列范围在0~n之间的随机整数。

7.1 垂直拼合数组

输入:

np.vstack((a, b))

输出:

array([[8, 6, 4],
       [0, 0, 4],
       [6, 5, 4],
       [2, 7, 1],
       [3, 8, 2],
       [7, 8, 4]])

7.2 水平拼合数组

输入:

np.hstack((a, b))

输出:

array([[8, 6, 4, 2, 7, 1],
       [0, 0, 4, 3, 8, 2],
       [6, 5, 4, 7, 8, 4]])

7.3 沿纵轴分割数组

输入:

np.vsplit(a, 3)

输出:

[array([[8, 6, 4]]), array([[0, 0, 4]]), array([[6, 5, 4]])]

按行分割

7.4 沿横轴分割数组

输入:

np.hsplit(a, 3)

输出:

[array([[8],
        [0],
        [6]]), array([[6],
        [0],
        [5]]), array([[4],
        [4],
        [4]])]

按列分割

8.数组排序

生成示例数组
输入:

a = np.array(([1, 4, 3], [6, 2, 9], [4, 7, 2]))
a

输出:

array([[1, 4, 3],
       [6, 2, 9],
       [4, 7, 2]])

8.1 返回每列最大值

输入:

np.max(a, axis=0)

输出:

array([6, 7, 9])

axis=0 表示对列进行操作

8.2 返回每行最小值

输入:

np.min(a, axis=1)

输出:

array([1, 2, 2])

axis=1 表示对行进行操作

8.3 返回每列最大值索引

输入:

np.argmax(a, axis=0)

输出:

array([1, 2, 1])

8.4 返回每行最小值索引

输入:

np.argmin(a, axis=1)

输出:

array([0, 1, 2])

9.数组统计

示例数组:

array([[1, 4, 3],
       [6, 2, 9],
       [4, 7, 2]])

9.1 统计数组各列的中位数

输入:

np.median(a, axis=0)

输出:

array([4., 4., 3.])

9.2 统计数组各行的==算术平均值==

输入:

np.mean(a, axis=1)

输出:

array([2.66666667, 5.66666667, 4.33333333])

9.3 统计数组各列的==加权平均值==

输入:

np.average(a, axis=0)

输出:

array([3.66666667, 4.33333333, 4.66666667])

两者的区别和用法

9.4 统计数组各行的方差

输入:

np.var(a, axis=1)

输出:

array([1.55555556, 8.22222222, 4.22222222])

9.5 统计数组各列的标准偏差

输入:

np.std(a, axis=0)

输入:

array([2.05480467, 2.05480467, 3.09120617])

高阶操作

10.按需创建数组

10.1 创建一个 5×5 的二维数组,其中边界值为1,其余值为0

输入:

Z = np.ones((5,5))
Z[1:-1,1:-1] = 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.]])

Z[1:-1,1:-1] = 0 分别对行和列进行重新赋值。

10.2使用数字 0 将一个全为 1 的 5×5 二维数组包围

输入:

Z = np.ones((5,5))
Z = np.pad(Z, pad_width=1, mode='constant', constant_values=0)
Z

输出:

array([[0., 0., 0., 0., 0., 0., 0.],
       [0., 1., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 1., 0.],
       [0., 0., 0., 0., 0., 0., 0.]])

注意np.pad的使用方法 CSDN

10.3 创建一个 5×5 的二维数组,并设置值 1, 2, 3, 4 落在其对角线下方

输入:

Z = np.diag(1+np.arange(4),k=-1)
Z

输出:

array([[0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0],
       [0, 2, 0, 0, 0],
       [0, 0, 3, 0, 0],
       [0, 0, 0, 4, 0]])

np.diag用法

10.4 创建一个 10×10 的二维数组,并使得 1 和 0 沿对角线间隔放置

输入:

Z = np.zeros((10,10),dtype=int)
Z[1::2,::2] = 1
Z[::2,1::2] = 1
Z

输出:

array([[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
       [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
       [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
       [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
       [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]])

注意这里对行列的交替赋值

10.5 创建一个 0-10 的一维数组,并将 (1, 9] 之间的数全部反转成负数

输入:

Z = np.arange(11)
Z[(1 < Z) & (Z <= 9)] *= -1
Z

输出:

array([ 0,  1, -2, -3, -4, -5, -6, -7, -8, -9, 10])

10.6 找出两个一维数组中相同的元素

输入:

Z1 = np.random.randint(0,10,10)
Z2 = np.random.randint(0,10,10)
print("Z1:", Z1)
print("Z2:", Z2)
np.intersect1d(Z1,Z2)

输出:

Z1: [7 5 6 8 2 7 3 4 0 4]
Z2: [9 4 9 2 1 0 0 0 4 7]
array([0, 2, 4, 7])

10.7 使用 NumPy 打印昨天、今天、明天的日期

输入:

yesterday = np.datetime64('today', 'D') - np.timedelta64(1, 'D')
today     = np.datetime64('today', 'D')
tomorrow  = np.datetime64('today', 'D') + np.timedelta64(1, 'D')
print("yesterday: ", yesterday)
print("today: ", today)
print("tomorrow: ", tomorrow)

输出:

yesterday:  2018-11-28
today:  2018-11-29
tomorrow:  2018-11-30
Nemo版权所有丨如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:https://kanghaov.com/35.html
https://secure.gravatar.com/avatar/9fd8359b8faa6f7789f9623ba6041e4a?s=256&d=identicon&r=g

kanghaov

文章作者

推荐文章

发表评论

textsms
account_circle
email

Nemo

Numpy语法总结
Numpy介绍 numpy支持大量高维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。 知识点 创建数组 数组运算 数学函数 数组的切片和索引 数组形状操作 数组排序 数组统计 …
扫描二维码继续阅读
2019-05-07