2012-06-20 47 views
6

我有一個800x800陣列,我想分析它的外部部分。 我需要一個沒有切片[5:-5,5:-5]元素的新數組。 它不一定要返回一個2d數組,平面數組或列表也可以。 例子:如何刪除2d數組子集?

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(),但它似乎一次只適用於一個軸。 我不知道是否有更直接的方式來做到這一點。

回答

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

如果使用float數組,而不是一個整數數組,您可以通過使用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) 
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]) 
+0

偉大的選擇,因爲我沒有修改原德陣列和沒有必要知道數組 – user1470350

+0

的內容@ user1470350 - 是啊,它的一個很好的方式來做事:) – fraxel