如何删除二维数组的子集?

6

我有一个800x800的数组,我只想分析它外部的元素。我需要一个没有切片 [5:-5,5:-5] 中的元素的新数组。它不一定要返回一个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个回答

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

很好的选择,因为我不需要修改原始数组,也不需要知道数组的内容。 - user1470350
@user1470350 - 是的,这是一个不错的做事方式 :) - fraxel

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接