したがって、次のような配列から始めます。
In [1]: import numpy as np
In [2]: a = np.arange(20).reshape((10,-1))
In [3]: a
Out[3]:
array([[ 0, 1],
[ 2, 3],
[ 4, 5],
[ 6, 7],
[ 8, 9],
[10, 11],
[12, 13],
[14, 15],
[16, 17],
[18, 19]])
あなたが探しているのはreshape
と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]])
Reshape はタプルを取ります。私はそれを(行数、数、または列数)と考えるのが好きです。この場合、(-1,4) は次のことを意味します: 4 つの列を使用し (したがって、各行には 4 つの数値が含まれます)、データの量から行の量を計算します。
を使用argsort
すると、必要な配列を取得できます。
In [2]: import numpy as np
In [3]: d = np.random.random((10, 2)).reshape((-1,4))
In [4]: d
Out[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]: e
Out[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
: 配列のリストが 1 つの大きな配列に結合されます。
次に、別の形状変更を使用して、データを元の形状に戻します
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 np
In [2]: a = np.arange(100).reshape((-1,10))
In [3]: a
Out[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]: e
Out[7]:
array([[4, 3],
[2, 1]])
次に、この結果を元の配列またはコピーに配置できます。
In [12]: a[3:5, 0:2] = e
In [13]: a
Out[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 サブマトリックスが意図したとおりに機能するには、画像の幅と高さの両方が均一である必要があることに注意してください...