我的视频学习笔记
Numpy的属性
import numpy as np
array = np.array([[1, 2, 3],
[2, 3, 4]])
print(array)
print('Number of dim : ', array.ndim) # 2维数组
print('Shape of array : ', array.shape) # shape是2×3的
print('Size of array : ', array.size) # 一共有6个元素
创建array
a = np.array([2, 23, 4], dtype=np.float) # 以列表的格式创建 输出是没有逗号的
# dtype=np.float 输出 float64 后面跟的数字越小占用的内存越小,但是精度也越低 一帮用 np.float & np.int
a = np.array([[2, 23, 4],
[2, 32, 4]]) # [[ 2 23 4] [ 2 32 4]]
# 定义全部为0的矩阵
a = np.zeros((3, 4)) # [[0. 0. 0. 0.] [0. 0. 0. 0.] [0. 0. 0. 0.]]
# 定义全部为1的整型矩阵
a = np.ones((3, 4), dtype=np.int) # [[1 1 1 1] [1 1 1 1] [1 1 1 1]]
# 定义empty的矩阵
a = np.empty((3, 4)) # [[0. 0. 0. 0.] [0. 0. 0. 0.] [0. 0. 0. 0.]]
# 定义有序数列
a = np.arange(10, 20, 2) # [10 12 14 16 18] start:10 end:20 step:2
a = np.arange(12).reshape((3, 4)) # [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]]
# 生成一个线段
a = np.linspace(1, 10, 5) # 从1到10分成4段5个点的线段 [ 1. 3.25 5.5 7.75 10. ]
a = np.linspace(1, 10, 6).reshape((2, 3)) # [[ 1. 2.8 4.6] [ 6.4 8.2 10. ]]
基础运算1
a = np.array([10, 20, 30, 40])
b = np.arange(4)
c = a - b # 逐个相减 [10 19 28 37] 相加,相乘等 等同
c = 10 * np.sin(a) # 三角函数运算 [-5.44021111 9.12945251 -9.88031624 7.4511316 ]
print(b < 3) # b的形式:[0 1 2 3] 输出 b < 3 的结果[ True True True False]
a = np.array([[1, 1],
[0, 1]])
b = np.arange(4).reshape((2, 2))
c = a * b # 逐个相乘 [[0 1] [0 3]]
c_dot = np.dot(a, b) # 矩阵相乘 [[2 4] [2 3]]
c_dot_2 = a.dot(b) # 与c_dot等同
# 随机生成一个array 随机产生一个0~1的n行*m列的array
a = np.random.random((2, 4))
print(a)
c = np.sum(a) # array 元素求和
c = np.min(a) # array 元素最小值
c = np.max(a) # array 元素最大值
c = np.sum(a, axis=0) # axis=0 是每一列求和 axis=1是每一行求和
c = np.min(a, axis=1) # axis=0 是每一列求最小值 axis=1是每一行求最小值
c = np.max(a, axis=1) # axis=0 是每一列求最大值 axis=1是每一行求最大值
print(c)
输出:
[ True True True False]
[[0.73580635 0.10301389 0.74798967 0.72380255]
[0.09029418 0.60661582 0.72279016 0.0947304 ]]
[0.74798967 0.72279016]
基础运算2
A = np.arange(2, 14).reshape((3, 4)) # [[ 2 3 4 5] [ 6 7 8 9] [10 11 12 13]]
c = np.argmin(A) # 最小值的索引 0
c = np.argmax(A) # 最大值的索引 11
c = np.mean(A) # 计算A的平均值
c = np.mean(A, axis=1) # axis=0 是每一列求平均值 axis=1是每一行求平均值
c = A.mean() # 和前一个的算法等同 也是计算A的平均值
c = np.average(A) # 和前一个的算法等同 也是计算A的平均值
c = np.median(A) # 找到A的中位数
c = np.cumsum(A) # 逐步累加 [ 2 5 9 14 20 27 35 44 54 65 77 90]
c = np.diff(A) # array里每两个数的差 [[1 1 1] [1 1 1] [1 1 1]] 3行3列
c = np.nonzero(A) # 输出非0的行列 前面为行 后面为列 (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 = np.arange(14, 2, -1).reshape((3, 4)) # [[14 13 12 11] [10 9 8 7] [ 6 5 4 3]]
c = np.sort(A) # 逐行从小到大排序 [[11 12 13 14][ 7 8 9 10] [ 3 4 5 6]]
c = np.transpose(A) # A的转置
# [[14 10 6]
# [13 9 5]
# [12 8 4]
# [11 7 3]]
c = A.T # 同上一个算法 [[14 10 6] [13 9 5] [12 8 4] [11 7 3]]
c = np.transpose(A).dot(A) # A的转置与A做矩阵乘法
c = np.clip(A, 5, 9) # 将A中所有小于5的数都改乘5 大于9的数改成9 5和9之间的数保留
# [[9 9 9 9]
# [9 9 8 7]
# [6 5 5 5]]
numpy的索引
A = np.arange(3, 15).reshape((3, 4))
print(A)
print(A[2]) # 索引处第2行所有元素
print(A[2, :]) # 索引处第2行所有元素
print(A[1][1]) # 索引处第1行第1个元素
print(A[1, 1]) # 索引处第1行第1个元素
print(A[:, 1]) # 索引处第1列所有元素
print(A[1, 1: 3]) # 索引处第1行第1个和第2个元素
for row in A: # 用for循环 循环A的话 默认是按行来的
print(row)
for column in A.T: # 迭代列 将A转置 即可实现迭代列
print(column)
print(A.flatten()) # 将3行4列的矩阵A转变成一个1行的序列
for item in A.flat: # 输出每一个序列的项目
print(item)
输出:
[[ 3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]]
[11 12 13 14]
[11 12 13 14]
8
8
[ 4 8 12]
[8 9]
[3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]
[ 6 10 14]
[ 3 4 5 6 7 8 9 10 11 12 13 14]
3
4
5
6
7
8
9
10
11
12
13
14
array的合并
A = np.array([1, 1, 1])
B = np.array([2, 2, 2])
C = np.vstack((A, B)) # vstack--vertical stack 上下合并 [[1 1 1] [2 2 2]]
D = np.hstack((A, B)) # hstack--horizontal 左右合并成一个六个元素的序列 [1 1 1 2 2 2]
print(A.shape, C.shape, D.shape) # A的shape是(3,)tuple类型只有三个元素 C的shape是(2, 3)即2行3列 D的shape是(6,)
E = A.T # 序列是不能被转置的 所以仍为 [1 1 1]
E = A[np.newaxis, :] # 在行上加了一个维度 [[1 1 1]]
E = A[:, np.newaxis] # 在列上加了一个维度 [[1] [1] [1]]
A = A[:, np.newaxis]
B = B[:, np.newaxis]
E = np.concatenate((A, B, A, B), axis=1) # 可以决定多个array纵向或横向的合并 axis=1 左右合并 axis=0 上下合并
print(E)
输出:
(3,) (2, 3) (6,)
[[1 2 1 2]
[1 2 1 2]
[1 2 1 2]]
array的分割
A = np.arange(12).reshape((3, 4))
C = np.split(A, 2, axis=1) # 将A列向分割成两块
# [array([[0, 1],
# [4, 5],
# [8, 9]]),
# array([[ 2, 3],
# [ 6, 7],
# [10, 11]])]
C = np.split(A, 3, axis=0) # 将A横向分成三块
# [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
C = np.array_split(A, 3, axis=1) # 不等分割 2:1:1
# [array([[0, 1],
# [4, 5],
# [8, 9]]),
# array([[ 2],
# [ 6],
# [10]]),
# array([[ 3],
# [ 7],
# [11]])]
C = np.vsplit(A, 3) # 按行分成3块
C = np.hsplit(A, 2) # 按列分成2块
a = np.arange(4) # [0 1 2 3]
b = a # [0 1 2 3]
c = a # [0 1 2 3]
d = b # [0 1 2 3]
a[0] = 11
d[1: 3] = [22, 33]
print(a, b, c, d) # [11 22 33 3] [11 22 33 3] [11 22 33 3] [11 22 33 3]
e = a.copy() # 只想赋值 不想关联 a的变化与e无关 [11 22 33 3] 指向不同的地址
a[0] = 22
e[0] = 100
print(a)
print(e)
输出:
[11 22 33 3] [11 22 33 3] [11 22 33 3] [11 22 33 3]
[22 22 33 3]
[100 22 33 3]