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 赋值为深拷贝, 此时 ab 已经没有关联。

四、 numpy 参考资料

1. NumPy 快速入门教程

2. NumPy 中文教程

3. NumPy 官方 API 参考手册

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值