numpy array 数组旋转、排序操作笔记
平时对于数组的旋转、排序常常会用到,但是网上找了一圈都是碎片式的,把相关的操作汇总一下,方便使用。
数转旋转
生成
import numpy as np
size = (3,5)
D = np.arange(size[0]*size[1]).reshape(size)
运行结果:
>>> size = (3,5)
>>> D = np.arange(size[0]*size[1]).reshape(size)
>>> print(D)
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
>>>
按列反转:上下翻转
D[::-1]
>>> D
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> D[::-1]
array([[10, 11, 12, 13, 14],
[ 5, 6, 7, 8, 9],
[ 0, 1, 2, 3, 4]])
按行反转:左右翻转
左右翻转也就是沿Y轴对称;
D[:,::-1]
>>> D
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> D[:,::-1]
array([[ 4, 3, 2, 1, 0],
[ 9, 8, 7, 6, 5],
[14, 13, 12, 11, 10]])
转置:行列互换
D.T
>>> D
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> D.T
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
以下是组合应用
顺时针旋转九十度
D[::-1].T
>>> D
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> D[::-1].T
array([[10, 5, 0],
[11, 6, 1],
[12, 7, 2],
[13, 8, 3],
[14, 9, 4]])
逆时针旋转九十度
D[:,::-1].T
>>> D
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> D[:,::-1].T
array([[ 4, 9, 14],
[ 3, 8, 13],
[ 2, 7, 12],
[ 1, 6, 11],
[ 0, 5, 10]])
旋转180度
D[::-1][:,::-1]
>>> D
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> D[::-1][:,::-1]
array([[14, 13, 12, 11, 10],
[ 9, 8, 7, 6, 5],
[ 4, 3, 2, 1, 0]])
沿/方向对称翻转
D[::-1][:,::-1].T
>>> D
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> D[::-1][:,::-1].T
array([[14, 9, 4],
[13, 8, 3],
[12, 7, 2],
[11, 6, 1],
[10, 5, 0]])
** 沿\方向对称翻转 **
D[:,::-1][::-1].T
>>> D
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> D[:,::-1][::-1].T
array([[14, 9, 4],
[13, 8, 3],
[12, 7, 2],
[11, 6, 1],
[10, 5, 0]])
数组排序
生成随机数组
D = np.random.random (size)
>>> D = np.random.random (size)
>>> D
array([[0.02156847, 0.84666417, 0.40878565, 0.7753874 , 0.92004559],
[0.92827944, 0.37388593, 0.79962878, 0.67969317, 0.55302909],
[0.12713696, 0.88070786, 0.21681744, 0.47167429, 0.48588948]])
按行升序
np.sort (D)
或者直接在D上排序:
D.sort()
>>> np.sort (D)
array([[0.02156847, 0.40878565, 0.7753874 , 0.84666417, 0.92004559],
[0.37388593, 0.55302909, 0.67969317, 0.79962878, 0.92827944],
[0.12713696, 0.21681744, 0.47167429, 0.48588948, 0.88070786]])
** 按行降序 **
np.sort (D)[:,::-1]
或者更简洁的:
np.sort (-D)
>>> np.sort (D)[:,::-1]
array([[0.92004559, 0.84666417, 0.7753874 , 0.40878565, 0.02156847],
[0.92827944, 0.79962878, 0.67969317, 0.55302909, 0.37388593],
[0.88070786, 0.48588948, 0.47167429, 0.21681744, 0.12713696]])
** 获得排序的结果 **
np.argsort(D)
>>> np.argsort(D)
array([[1, 4, 2, 3, 0],
[1, 3, 0, 2, 4],
[1, 4, 3, 0, 2]], dtype=int64)
** 把排序结果应用到另一个数组上 **
这种情况常常中于两个数组,一个数组按另一个数组的排序结果进行排序,
例如一个数组I存的是索引号,另一个数组D存的是得分值,
需要让索引号数组I按得分数组D进行排序。
size = (3,5)
D = np.random.random (size)
# 生成一个新的数组I
I = (np.random.random (size)*100).astype(int)
# 按行降序排序
index = np.argsort(-D)
# 构造一个索引
r = np.arange(D.shape[0])[:,None]
# 对I进行排序
I = I[r,index]
运行过程如下:
>>> D = np.random.random (size)
>>> D
array([[0.02156847, 0.84666417, 0.40878565, 0.7753874 , 0.92004559],
[0.92827944, 0.37388593, 0.79962878, 0.67969317, 0.55302909],
[0.12713696, 0.88070786, 0.21681744, 0.47167429, 0.48588948]])
>>> I = (np.random.random (size)*100).astype(int)
>>> I
array([[91, 12, 8, 60, 76],
[35, 43, 84, 53, 55],
[ 2, 32, 36, 82, 7]])
>>> index = np.argsort(-D)
>>> index
array([[4, 1, 3, 2, 0],
[0, 2, 3, 4, 1],
[1, 4, 3, 2, 0]], dtype=int64)
>>> r = np.arange(D.shape[0])[:,None]
>>> r
array([[0],
[1],
[2]])
>>> I = I[r,index]
>>> I
array([[76, 12, 60, 8, 91],
[35, 84, 53, 55, 43],
[32, 7, 82, 36, 2]])