1

Numpy の 2 次元配列から行と列をスライス/返すために 1 次元配列の値を使用しようとしています。たとえば、次の 1 つの次元配列があるとします: [1,3,5)] と次の 2 つの次元配列:

array([[1, 0, 0, 0, 0, 0],
       [0, 4, 0, 0, 0, 1],
       [0, 0, 3, 0, 0, 0],
       [0, 1, 0, 7, 0, 10],
       [0, 0, 0, 0, 8, 0],
       [0, 2, 0, 0, 0, 9]])

以下を返すにはどうすればよいですか。

array([[4, 0, 1],
       [1, 7, 10],
       [2, 0, 9]])

また、同じ例を使用して 6x6 マスクを作成できるようにしたいと考えています。私がこれを得るために:

array([[True, True, True, True, True, True],
       [True, False, True, False, True, False],
       [True, True, True, True, True, True],
       [True, False, True, False, True, False],
       [True, True, True, True, True, True],
       [True, False, True, False, True, False]],)

私はさまざまなことを試しましたが、必要なものが正確に得られないようです。いくつかのループを書くことでそれができることはわかっていますが、もっと簡単な方法があるに違いないと考えました。私も多くの検索を行いましたが、まだ運がありません。前もって感謝します!

4

4 に答える 4

1

ルーチン np.meshgrid() が役立つかもしれません:

a = array([[1, 0, 0, 0, 0, 0],
   [0, 4, 0, 0, 0, 1],
   [0, 0, 3, 0, 0, 0],
   [0, 1, 0, 7, 0, 10],
   [0, 0, 0, 0, 8, 0],
   [0, 2, 0, 0, 0, 9]])

b = np.array([1, 3, 5])

B = np.meshgrid(b,b)

print a[B].T

Out: [[ 4  0  1]
      [ 1  7 10]
      [ 2  0  9]]

それが望ましい結果だと思います。

于 2013-06-20T04:21:32.260 に答える
0

a大きな配列を に入れ、小さな配列を に入れればi、 でスライスできますa[i][...,i]。おそらくワンステップでそれを行う方法もありますが、私はまだそれを知るのに十分な数の魔法使いではありません.

于 2013-06-19T23:42:55.377 に答える
0

mgilson の答えは、ストライドが規則的であることがわかっている場合に必要なものです。ただし、が配列で、すべての 1 次元配列を取得したい場合aは、落とし穴があります。a[i, j]ijb

In : a = array([[1, 0, 0, 0, 0, 0],
       [0, 4, 0, 0, 0, 1],
       [0, 0, 3, 0, 0, 0],
       [0, 1, 0, 7, 0, 10],
       [0, 0, 0, 0, 8, 0],
       [0, 2, 0, 0, 0, 9]])

In : b = np.array([1, 3, 5])

In : a[b, b]
Out: array([4, 7, 9])

問題は、これが要素 (1, 1)、(3, 3)、および (5, 5) を取得することです。別々のステップで索引付けをしようとすると、

In : a[b][b]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-87-c3c286c42537> in <module>()
----> 1 a[b][b]

IndexError: index 3 is out of bounds for axis 0 with size 3

このエラーは、同じ軸に 2 回インデックスを付けているために発生します。これらのいずれかが機能します。

In : a[b][:, b]
Out:
array([[ 4,  0,  1],
       [ 1,  7, 10],
       [ 2,  0,  9]])

In : a[:, b][b]
Out:
array([[ 4,  0,  1],
       [ 1,  7, 10],
       [ 2,  0,  9]])

[b]行を選択し、[:, b]列を選択します。これらのインデックス作成操作は入れ替えることができます。

于 2013-06-19T23:53:52.220 に答える