Numpy 目录
一、 numpy 的几种基本运算
1. argmin() 和 argmax()
其中的 argmin() 和 argmax() 两个函数分别对应着求矩阵中最小元素和最大元素的索引。
arr1 = np.arange(2, 14).reshape((3, 4))
print(np.argmax(arr1), np.argmin(arr1)) # 11 0
2. 计算统计中的均值
arr1 = np.arange(2, 14).reshape((3, 4))
print(np.mean(arr1), np.average(arr1)) # 7.5 7.5
print(arr1.mean()) # 7.5
求解中位数的函数:
print(np.median(arr1)) # 7.5
3. cumsum() 累加函数
A = np.arange(2, 14) # [ 2 3 4 5 6 7 8 9 10 11 12 13]
print(A)
print(np.cumsum(A)) # [ 2 5 9 14 20 27 35 44 54 65 77 90]
4. 累差运算函数
该函数计算的便是每一行中后一项与前一项之差。
故一个3行4列矩阵通过函数计算得到的矩阵便是3行3列的矩阵。
arr1 = np.arange(2, 14).reshape((3, 4))
print(arr1)
"""
[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
"""
print(np.diff(arr1))
"""
[[1 1 1]
[1 1 1]
[1 1 1]]
"""
5. nonzero() 函数
这个函数将所有非零元素的行与列坐标分割开,重构成两个分别关于行和列的矩阵。
arr1 = np.arange(2, 14).reshape((3, 4))
print(arr1) # ...
arr_x, arr_y = np.nonzero(arr1)
print(arr_x) # [0 0 0 0 1 1 1 1 2 2 2 2]
print(arr_y) # [0 1 2 3 0 1 2 3 0 1 2 3]
6. 排序操作
可以对所有元素进行仿照列表一样的排序操作,但这里的排序函数仍然仅针对每一行进行从小到大排序操作:
arr1 = np.arange(14, 2, -1).reshape((3, 4))
print(arr1)
# [[14 13 12 11]
# [10 9 8 7]
# [ 6 5 4 3]]
print(np.sort(arr1))
# [[11 12 13 14]
# [ 7 8 9 10]
# [ 3 4 5 6]]
7. 矩阵的转置
arr1 = np.arange(14, 2, -1).reshape((3, 4))
print(arr1)
"""
[[14 13 12 11]
[10 9 8 7]
[ 6 5 4 3]]
"""
print(np.transpose(arr1))
print(arr1.T)
"""
[[14 10 6]
[13 9 5]
[12 8 4]
[11 7 3]]
"""
8. clip() 函数
这个函数的格式是 clip(Array,Array_min,Array_max)
,顾名思义,Array
指的是将要被执行用的矩阵,而后面的最小值最大值
则用于让函数判断矩阵中元素是否有比最小值小的或者比最大值大的元素,并将这些指定的元素转换为最小值或者最大值。
arr1 = np.arange(14, 2, -1).reshape((3, 4))
print(arr1)
"""
[[14 13 12 11]
[10 9 8 7]
[ 6 5 4 3]]
"""
print(np.clip(arr1, 4, 10))
"""
[[10 10 10 10]
[10 9 8 7]
[ 6 5 4 4]]
"""
二、 索引与 ndarray 操作
1. 二维索引的简单使用
arr1 = np.arange(3, 15).reshape((3, 4))
print(arr1[1, 1:-1]) # 仍旧支持 slice
2. numpy.ndarray 多维的展开 --> flatten
arr1 = np.arange(3, 15).reshape((3, 4))
print(arr1.flatten()) # [ 3 4 5 6 7 8 9 10 11 12 13 14]
3. numpy array 合并
3.1 np.vstack() – vertical stack(垂直合并)
arr1 = np.arange(0, 10)
arr2 = np.arange(10, 20)
print(np.vstack((arr1, arr2)))
# [[ 0 1 2 3 4 5 6 7 8 9]
# [10 11 12 13 14 15 16 17 18 19]]
print(np.vstack((arr2, arr1)))
# [[10 11 12 13 14 15 16 17 18 19]
# [ 0 1 2 3 4 5 6 7 8 9]]
3.2 np.hstack() – horizontal stack(水平合并)
arr1 = np.arange(0, 10)
arr2 = np.arange(10, 20)
print(np.hstack((arr1, arr2)))
# [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
print(np.hstack((arr2, arr1)))
# [10 11 12 13 14 15 16 17 18 19 0 1 2 3 4 5 6 7 8 9]
3.3 np.newaxis() – 对非矩阵进行转置的方法
arr1 = np.arange(0, 10)[np.newaxis, :]
arr2 = np.arange(10, 20)[np.newaxis, :]
print(arr1.shape, arr2.shape) # (1, 10) (1, 10)
print(arr1.T)
如上图所示, 在创建新的 npdaray
时就使用 np.newaxis
将其调整为矩阵类型。
3.4 np.concatenate() – 多个矩阵合并
a = np.arange(0, 3)[:, np.newaxis]
b = np.arange(3, 6)[:, np.newaxis]
print(a.shape, b.shape) # (3, 1) (3, 1)
print(np.concatenate((a, b), axis=0))
# [[0]
# [1]
# [2]
# [3]
# [4]
# [5]]
print(np.concatenate((a, b, b, a), axis=1))
# [[0 3 3 0]
# [1 4 4 1]
# [2 5 5 2]]
当需要合并多个矩阵或序列时,借助上面的 concatenate
函数可以比前述的 vstack/hstack
更加方便,axis
参数很好的控制了矩阵的纵向或是横向打印, 当 axis=0
时纵向打印,当 axis=1
时横向打印。
4. numpy array 分割
a = np.arange(12).reshape((3, 4))
b = np.arange(12, 24).reshape((3, 4))
4.1 numpy.split
numpy.split(ary, indices_or_sections, axis=0)
Parameters:
ary: Array to be divided into sub-arrays.
indices_or_sections: int or 1-D array, If indices_or_sections is an integer, N, the array
will be divided into N equal arrays along axis. If such a split is not possible, an error is raised.
axis: int, optional. The axis along which to split, default is 0.
Returns:
sub-arrays: list of ndarrays, A list of sub-arrays as views into ary.
4.1.1 纵向分割 – axis=0
即当 axis=0
时,沿着 y
坐标轴将 ary
切割为 indices_or_sections
等分。
x = np.arange(9.0)
np.split(x, 3)
# [array([0., 1., 2.]), array([3., 4., 5.]), array([6., 7., 8.])]
x = np.arange(8.0)
print(np.split(x, [3, 5, 6, 10]))
# [array([0., 1., 2.]), array([3., 4.]), array([5.]), array([6., 7.]), array([], dtype=float64)]
4.1.2 横向分割 – axis=1
print(np.split(a, 2, axis=1))
# [array([[0, 1], [4, 5], [8, 9]]),
# array([[2, 3], [6, 7], [10, 11]])]
4.2 numpy.array_split – 不等量的分割
numpy.array_split(ary, indices_or_sections, axis=0)
具体用法和 split 相同,唯一的差别是 array_split
允许 indices_or_sections
参数可以是一个不被 axis
指示坐标轴长度整除的值。
采取的策略是:For an array of length l that should be split into n sections, it returns l % n sub-arrays of size l//n + 1 and the rest of size l//n.
x = np.arange(8.0)
print(np.array_split(x, 3))
# [array([0., 1., 2.]), array([3., 4., 5.]), array([6., 7.])]
4.3 numpy.vsplit & numpy.hsplit
print(np.vsplit(a, 3)) # 等于 print(np.split(a, 3, axis=0))
# [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
print(np.hsplit(b, 2)) # 等于 print(np.split(b, 2, axis=1))
# [array([[12, 13],
# [16, 17],
# [20, 21]]), array([[14, 15],
# [18, 19],
# [22, 23]])]
三、 numpy copy & deep copy
1. = 的赋值方式会带有关联性
a = np.arange(4)
b = a
print(a, b) # [0 1 2 3] [0 1 2 3]
a[1:3] = [22, 23]
print(a, b) # [ 0 22 23 3] [ 0 22 23 3]
可以发现改变 a
的值, b
的值也会同时改变, 即 =
赋值为浅拷贝。
2. copy() 的赋值方式没有关联性
a = np.arange(4)
b = a.copy()
print(a, b) # [0 1 2 3] [0 1 2 3]
a[1:3] = [22, 23]
print(a, b) # [ 0 22 23 3] [0 1 2 3]
可以发现改变 a
的值, b
的值不会同时改变, 即 copy
赋值为深拷贝, 此时 a
与 b
已经没有关联。