1

私はPythonに非常に慣れていないため、少しトリッキーな2D配列操作を行う必要があります。最善の方法がわかりません。

基本的に、0 から 1 までの値の配列から始めます。

2D配列に適用するには、移動する2x2ウィンドウが必要です(編集:配列は2D画像です。つまり、200x200ピクセル程度です)。各2x2ウィンドウ内で、値1〜4を逆に割り当てます。配列値の重み (つまり、2x2 の最小セルが 4 になり、次の最小セルが 3 になるなど)

ネストされたループで 2x2 ウィンドウを抽出する方法を確認できます。それが最善の方法ですか?

さらにトリッキーなのは、順序付けの割り当て方法です。

ウィンドウのサブ配列で numpy.where (subarray.min) を繰り返し使用することを考えましたが、返された場所で GET する方法がわかりません。これについてもっと良い方法がないかどうかはわかりません。

アドバイス?NumPy で複雑で面倒な配列操作を行う方法へのポインターは?

4

2 に答える 2

0

したがって、次のような配列から始めます。

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]])

あなたが探しているのはreshapeargsortだと思います。

メンバー関数を使用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 サブマトリックスが意図したとおりに機能するには、画像の幅と高さの両方が均一である必要があることに注意してください...

于 2013-05-24T21:26:15.600 に答える
0

おそらくこれが役立つでしょう[ここを参照]

呼び出し:

x = np.arange(36).reshape((6, 6))
print(x)
b = sliding_window(x, (2, 3), None, False) 
print(b)
于 2017-12-06T11:11:46.597 に答える