11

私の質問を説明する最も簡単な方法は例を使うことかもしれないので、いくつかの配列を定義しましょう:

>>> test = arange(25).reshape((5,5))
>>> test
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]])
>>> Xinds = array([1,2,3])
>>> Yinds = array([1,2,3])

ここで、行1、2、3、および列0の要素が必要な場合は、次のように実行できます。

>>> test[Yinds,0]
array([ 5, 10, 15])

行1、2、3およびすべての列の項目が必要な場合は、次のように実行できます。

>>> test[Yinds, :]
array([[ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

ただし、これを拡張して、行1、2、および3と列1、2、および3の要素を取得しようとすると、驚きます。-代わりに、(1,1)、(2,2)、および(3,3)の要素を取得します

>>> test[Yinds, Xinds]
array([ 6, 12, 18])

私が欲しいものの代わりに:

>>> test[Yinds, :][:, Xinds]
array([[ 6,  7,  8],
       [11, 12, 13],
       [16, 17, 18]])
>>> test[1:4,1:4]
array([[ 6,  7,  8],
       [11, 12, 13],
       [16, 17, 18]])

スライスを定義できることはわかっていますが、インデックスにオフセットを追加できるようにしたいので(Yinds + offsetなど)、スライスでは実行できません。

私は次のようなことをすることができます

>>> xStart = 1
>>> xEnd   = 4
>>> yStart = 1
>>> yEnd   = 4

>>> offset = 1
>>> test[yStart+offset:yEnd+offset, xStart+offset:xEnd+offset]
...

また

>>> Xinds = array([1,4])
>>> Yinds = array([1,4])

>>> offset = 1
>>> test[slice(*(Yinds+offset)), slice(*(Xinds+offset))]
...

しかし、どちらも特にきれいではありません。

モンキーが追加演算子をスライスにパッチすることはオプションではないようであり、スライスから継承して演算子を追加することも機能していないようです。「タイプ'スライス'は受け入れ可能な基本タイプではありません」というエラーが表示されます。(*Grumble*これはRuby*Grumble *では問題になりません)

だから、私の質問は、保存してオフセットできるもので(1次元以上の)サブ配列にアクセスするための最もクリーンな方法は何ですか?

これまでのオプション:

  • test [Yinds + offset、:] [:、Xinds + offset]
  • test [yStart + offset:yEnd + offset、xStart + offset:xEnd + offset]
  • test [slice(*(Yinds + offset))、slice(*(Xinds + offset))]
4

1 に答える 1

13

私はあなたが何を望んでいるのか完全にはわかりませんが、多分ix_助けになるでしょうか?numpyについて、私が同じような状況で使用するよりもよく知っている人を見たことがあると思います。

>>> from numpy import array, arange, ix_
>>> a = arange(25).reshape(5,5)
>>> Xinds = array([1,2,3])
>>> Yinds = array([1,2,3])
>>> a
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]])
>>> a[ix_(Xinds, Yinds)]
array([[ 6,  7,  8],
       [11, 12, 13],
       [16, 17, 18]])
>>> a[ix_(Xinds+1, Yinds)]
array([[11, 12, 13],
       [16, 17, 18],
       [21, 22, 23]])
>>> Y2inds = array([1,3,4])
>>> a[ix_(Xinds, Y2inds)]
array([[ 6,  8,  9],
       [11, 13, 14],
       [16, 18, 19]])
>>> a[ix_(Xinds, Y2inds-1)]
array([[ 5,  7,  8],
       [10, 12, 13],
       [15, 17, 18]])
于 2012-06-12T01:32:04.080 に答える