慕桂英546537
因此,您将从这样的数组开始:In [1]: import numpy as npIn [2]: a = np.arange(20).reshape((10,-1))In [3]: aOut[3]: array([[ 0, 1], [ 2, 3], [ 4, 5], [ 6, 7], [ 8, 9], [10, 11], [12, 13], [14, 15], [16, 17], [18, 19]])我想您正在寻找reshapeand argsort。使用reshape成员函数,您可以更改形状而无需更改顺序:In [4]: a.reshape((-1,4))Out[4]: array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19]])重塑需要一个元组。我喜欢将其视为(行数,数字或列数)。在这种情况下,(-1,4)表示:使用4列(因此每行中有四个数字),然后根据数据量计算行数。使用argsort您可以获得所需的数组。In [2]: import numpy as npIn [3]: d = np.random.random((10, 2)).reshape((-1,4))In [4]: dOut[4]: array([[ 0.65945195, 0.1907593 , 0.1630845 , 0.76949532], [ 0.90823488, 0.71518689, 0.38422877, 0.77824007], [ 0.31453967, 0.76592537, 0.5871099 , 0.09306465], [ 0.38251335, 0.97461878, 0.97562622, 0.87532202], [ 0.12358359, 0.20323007, 0.397975 , 0.615806 ]])In [7]: e = np.array([4-np.argsort(r) for r in d])In [8]: eOut[8]: array([[2, 3, 4, 1], [2, 3, 1, 4], [1, 4, 2, 3], [4, 1, 3, 2], [4, 3, 2, 1]])如您所见,现在每一行都有所需的索引。让我们回顾一下第7行从内到外的操作:for r in d:遍历d中的所有行。4 - np.argsort(r):argsort会在0-3范围内创建索引。因此,我们将其从4减去以达到4-1的反比范围。在numpy数组中,对每个元素都进行了操作,因此其4 - np.array([2, 1, 0, 3])行为类似于np.array([4,4,4,4]) - np.array([2, 1, 0, 3])。[]:方括号之间的前几行使它成为列表理解,这就像一个非常快速且紧凑的for循环返回列表一样。np.array:将数组列表合并为一个大数组。然后使用另一种整形,将数据恢复为原始形状In [9]: e.reshape((-1,2))Out[9]: array([[2, 3], [4, 1], [2, 3], [1, 4], [1, 4], [2, 3], [4, 1], [3, 2], [4, 3], [2, 1]])
不负相思意
您可以执行以下操作。假设您有一个2D矩阵:In [1]: import numpy as npIn [2]: a = np.arange(100).reshape((-1,10))In [3]: aOut[3]: array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], [40, 41, 42, 43, 44, 45, 46, 47, 48, 49], [50, 51, 52, 53, 54, 55, 56, 57, 58, 59], [60, 61, 62, 63, 64, 65, 66, 67, 68, 69], [70, 71, 72, 73, 74, 75, 76, 77, 78, 79], [80, 81, 82, 83, 84, 85, 86, 87, 88, 89], [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])您可以选择一个2x2子矩阵,如下所示:In [4]: a[3:5, 0:2]Out[4]: array([[30, 31], [40, 41]])这里的模式是a[row:row+2, column:column+2]。使用上面显示的reshape和argsort技术,您可以创建新值。In [5]: p = a[3:5, 0:2]In [6]: e = 4-np.argsort(p.reshape((1,4))).reshape((2,2))In [7]: eOut[7]: array([[4, 3], [2, 1]])然后,您可以将此结果放置在原始数组或副本中:In [12]: a[3:5, 0:2] = eIn [13]: aOut[13]: array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [ 4, 3, 32, 33, 34, 35, 36, 37, 38, 39], [ 2, 1, 42, 43, 44, 45, 46, 47, 48, 49], [50, 51, 52, 53, 54, 55, 56, 57, 58, 59], [60, 61, 62, 63, 64, 65, 66, 67, 68, 69], [70, 71, 72, 73, 74, 75, 76, 77, 78, 79], [80, 81, 82, 83, 84, 85, 86, 87, 88, 89], [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])请注意,图像的宽度和高度都必须是均匀的,才能使2x2子矩阵按预期工作...