Python-莫烦python学习笔记(numpy)

Python numpy 库的初尝试。学习自莫烦python。

前言

正文

2.1numpy 属性

导入 numpy 库,并简写为 np

python
import numpy as np

创建一个数组

python
array = np.array([[1, 2, 3],
                  [2, 3, 4]])

打印数组

python
print(array)
[[1 2 3]
 [2 3 4]]

打印数组的维度

python
print(array.ndim)
2

打印数组的形状

python
print(array.shape)
(2, 3)

打印数组的大小

python
print(array.size)
6

2.2 numpy 的创建 array

python
import numpy as np

定义 array 的 dtype

python
a = np.array([2, 23, 4], dtype = np.int64)

打印数组类型

python
print(a.dtype)
int64

定义零矩阵

python
np.zeros((3, 4))
array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])

定义全为一的矩阵

python
np.ones((3, 4))
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])

定义未初始化的矩阵

如果之前未定义过矩阵,内容为十分接近于 0 的随机数,否则值与上一个定义过的矩阵内容一致

python
np.empty((3, 4))
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])

定义有序的数列,np.arange(初始值,最终值,步长)

python
np.arange(10, 20, 2)
array([10, 12, 14, 16, 18])

将一个有序数列转换为矩阵

python
np.arange(12).reshape(3, 4)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

生成线段,np.linspace(初始值,最终值,段数)

python
np.linspace(1, 10, 5)
array([ 1.  ,  3.25,  5.5 ,  7.75, 10.  ])

生成线段,并把它改为矩阵

python
np.linspace(1, 10, 6).reshape((2, 3))
array([[ 1. ,  2.8,  4.6],
       [ 6.4,  8.2, 10. ]])

2.3 numpy 基础运算

python
import numpy as np

创建两个数组

python
a = np.array([10, 20, 30, 40])
b = np.arange(4)
print(a)
print(b)
[10 20 30 40]
[0 1 2 3]

数组相减

python
a - b
array([10, 19, 28, 37])

数组乘方

python
a ** b
array([    1,    20,   900, 64000], dtype=int32)

对于 a 的每个值,进行正弦运算

python
np.sin(a)
array([-0.54402111,  0.91294525, -0.98803162,  0.74511316])

对 b 的每个数进行判断

python
b < 3
array([ True,  True,  True, False])
python
b == 3
array([False, False, False,  True])

定义二维矩阵

python
a = np.array([[1, 1],
              [0, 1]])
b = b.reshape(2, 2)
print(a)
print(b)
[[1 1]
 [0 1]]
[[0 1]
 [2 3]]

矩阵逐个相乘

python
a * b
array([[0, 1],
       [0, 3]])

矩阵乘法

python
np.dot(a, b)
array([[2, 4],
       [2, 3]])
python
a.dot(b)
array([[2, 4],
       [2, 3]])

创建随机生成矩阵,内容为 0 到 1 的随机数

python
a = np.random.random((2, 4))
print(a)
[[0.8173095  0.68161518 0.69519572 0.38590121]
 [0.75305129 0.12209991 0.31815067 0.08084771]]

矩阵求和

python
np.sum(a)
3.854171189705032

矩阵最小值

python
np.min(a)
0.08084770650268369

矩阵在第 1 维度(每一行)的求和

python
np.sum(a, axis=1)
array([2.58002161, 1.27414958])

矩阵在每一列的求和

python
np.sum(a, axis=0)
array([1.57036079, 0.80371509, 1.01334639, 0.46674891])

2.4 numpy 基础运算 2

python
import numpy as np

定义一个矩阵

python
A = np.arange(2, 14).reshape((3, 4))
print(A)
[[ 2  3  4  5]
 [ 6  7  8  9]
 [10 11 12 13]]

查询 A 中最小值的索引

python
np.argmin(A)
0

查询 A 中最大值的索引

python
np.argmax(A)
11

计算 A 的平均值

python
np.mean(A)
7.5
python
A.mean()
7.5
python
np.average(A)
7.5

计算 A 的中位数

python
np.median(A)
7.5

累加 A

python
np.cumsum(A)
array([ 2,  5,  9, 14, 20, 27, 35, 44, 54, 65, 77, 90], dtype=int32)

累差 A(后一列减前一列)

python
np.diff(A)
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])

找出 A 中所有非零的下标(行,列)

python
np.nonzero(A)
(array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64),
 array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))

对 A 进行逐行排序

python
A = np.arange(14, 2, -1).reshape((3, 4))
print(A)
[[14 13 12 11]
 [10  9  8  7]
 [ 6  5  4  3]]
python
np.sort(A)
array([[11, 12, 13, 14],
       [ 7,  8,  9, 10],
       [ 3,  4,  5,  6]])

矩阵的转置

python
A.T
array([[14, 10,  6],
       [13,  9,  5],
       [12,  8,  4],
       [11,  7,  3]])
python
np.transpose(A)
array([[14, 10,  6],
       [13,  9,  5],
       [12,  8,  4],
       [11,  7,  3]])

限制 A 的最小值和最大值

python
np.clip(A, 5, 9)
array([[9, 9, 9, 9],
       [9, 9, 8, 7],
       [6, 5, 5, 5]])

对于矩阵 A 逐列求平均值

python
np.mean(A, axis=0)
array([10.,  9.,  8.,  7.])

2.5 numpy 索引

python
import numpy as np
 
A = np.arange(3, 15)
print(A)
[ 3  4  5  6  7  8  9 10 11 12 13 14]

查找 A 的第 3 个值

python
A[3]
6
python
A = A.reshape((3, 4))
print(A)
[[ 3  4  5  6]
 [ 7  8  9 10]
 [11 12 13 14]]

查找 A 的第 2 行

python
print(A[2])
[11 12 13 14]

查找 A 的第 1 行第 1 列

python
A[1][1]
8
python
A[1, 1]
8

查找 A 的第一列(用冒号代替所有的数)

python
A[:, 1]
array([ 4,  8, 12])

查找 A 的第一行,第一列到第三列之间的数

python
A[1, 1:3]
array([8, 9])

用 for 循环输出 A 的所有行

python
for row in A:
    print(row)
[3 4 5 6]
[ 7  8  9 10]
[11 12 13 14]

输出 A 的所有列

python
for col in A.T:
    print(col)
[ 3  7 11]
[ 4  8 12]
[ 5  9 13]
[ 6 10 14]

将 A 转换为序列

python
A.flatten()
array([ 3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

遍历 A 的各个元素

python
for item in A.flat:
    print(item, end=",")
3,4,5,6,7,8,9,10,11,12,13,14,

2.6 numpy array 合并

python
import numpy as np
 
A = np.array([1, 1, 1])
B = np.array([2, 2, 2])

A 和 B 向下合并(vertical stack)

python
C = np.vstack((A, B))
print(C)
print(A.shape, C.shape)
[[1 1 1]
 [2 2 3]]
(3,) (2, 3)

A 和 B 左右合并(horizontal stack)

python
C = np.hstack((A, B))
print(C)
print(A.shape, C.shape)
[1 1 1 2 2 3]
(3,) (6,)

将 A 从横向数列转换为竖向数列

python
A[:, np.newaxis]
array([[[1]],

       [[1]],

       [[1]]])

将 A 和 B 纵向合并

python
A = np.array([1, 1, 1])[:, np.newaxis]
B = np.array([2, 2, 2])[:, np.newaxis]
np.vstack((A, B))
array([[1],
       [1],
       [1],
       [2],
       [2],
       [2]])
python
np.hstack((A, B))
array([[1, 2],
       [1, 2],
       [1, 2]])

设定数组在哪一个维度进行合并

python
np.concatenate((A, B, B, A), axis=1) # axis=0 相当于 hstack,axis=1 相当于 vstack
array([[1, 2, 2, 1],
       [1, 2, 2, 1],
       [1, 2, 2, 1]])

2.7 numpy array 分割

python
import numpy as np
 
A = np.arange(12).reshape((3, 4))
print(A)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

等量分割 A,np.split(数组, 个数,维度)

python
np.split(A, 2, axis=1)
[array([[0],
        [4],
        [8]]),
 array([[1],
        [5],
        [9]]),
 array([[ 2],
        [ 6],
        [10]]),
 array([[ 3],
        [ 7],
        [11]])]
python
np.split(A, 3, axis=0)
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
python
np.vsplit(A, 3)
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
python
np.hsplit(A, 2)
[array([[0, 1],
        [4, 5],
        [8, 9]]),
 array([[ 2,  3],
        [ 6,  7],
        [10, 11]])]

不等量分割 A,np.array_split()

python
np.array_split(A, 3, axis=1)
[array([[0, 1],
        [4, 5],
        [8, 9]]),
 array([[ 2],
        [ 6],
        [10]]),
 array([[ 3],
        [ 7],
        [11]])]

2.8 numpy 的 copy & deep copy

python
import numpy as np
python
A = np.arange(4)
print(A)
[0 1 2 3]
python
B = A
C = A
D = B
A[0] = 11
print(A)
[11  1  2  3]

判断两个变量是否相同

python
B is A
True
python
D is A
True

A.copy()

当 A 的值被改变时,B,C,D 的值也会被改变

python
B = A.copy() # deep copy
B
array([11,  1,  2,  3])

此时改变 A 的值,不会改变 B 的值

python
A[3] = 44
A
array([11,  1,  2, 44])
python
B
array([11,  1,  2,  3])