6

800x800 の配列があり、その外側の部分の要素だけを分析したいと考えています。スライス [5:-5,5:-5] の要素を含まない新しい配列が必要です。必ずしも 2 次元配列を返す必要はありません。フラット配列またはリストでも同様です。例:

import numpy

>>> a = numpy.arange(1,10)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> a.shape = (3,3)
array([[1, 2, 3],
   [4, 5, 6],
   [7, 8, 9]])

次のようなコア要素を破棄する必要があります。

del a[1:2,1:2]

私は持っていると期待しています:

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

numpy.delete() を使用しようとしましたが、一度に 1 つの軸で機能するようです。これを行うためのより簡単な方法があるかどうか疑問に思います。

4

2 に答える 2

6

ブール配列を使用して、好きな方法で配列にインデックスを付けることができます。そうすれば、元の配列の値を変更したくない場合でも、変更する必要はありません。簡単な例を次に示します。

>>> import numpy as np
>>> a = np.arange(1,10).reshape(3,3)
>>> b = a.astype(bool)
>>> b[1:2,1:2] = False
>>> b
array([[ True,  True,  True],
       [ True, False,  True],
       [ True,  True,  True]], dtype=bool)
>>> a[b]
array([1, 2, 3, 4, 6, 7, 8, 9])
于 2012-06-20T21:21:18.630 に答える
2

中間領域をプレースホルダー値 (私は -12345 を使用しました。実際のデータでは発生しないものはすべて機能します) に置き換えてから、その値と等しくないものをすべて選択できます。

>>> import numpy as np
>>> a = np.arange(1,26)
>>> a.shape = (5,5)
>>> a
array([[ 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]])

>>> a[1:4,1:4] = -12345
>>> a
array([[     1,      2,      3,      4,      5],
       [     6, -12345, -12345, -12345,     10],
       [    11, -12345, -12345, -12345,     15],
       [    16, -12345, -12345, -12345,     20],
       [    21,     22,     23,     24,     25]])
>>> a[a != -12345]
array([ 1,  2,  3,  4,  5,  6, 10, 11, 15, 16, 20, 21, 22, 23, 24, 25])

整数配列ではなく浮動小数点配列を使用する場合は、 NaNisfiniteを使用して、もう少しエレガントに行うことができます。

>>> a = np.arange(1,26).astype('float32')
>>> a.shape = (5,5)
>>> a[1:4,1:4] = np.nan
>>> a
array([[  1.,   2.,   3.,   4.,   5.],
       [  6.,  nan,  nan,  nan,  10.],
       [ 11.,  nan,  nan,  nan,  15.],
       [ 16.,  nan,  nan,  nan,  20.],
       [ 21.,  22.,  23.,  24.,  25.]], dtype=float32)
>>> a[np.isfinite(a)]
array([  1.,   2.,   3.,   4.,   5.,   6.,  10.,  11.,  15.,  16.,  20.,
    21.,  22.,  23.,  24.,  25.], dtype=float32)
于 2012-06-20T20:58:35.977 に答える