【问题标题】:How to remove an 2d array subset?如何删除二维数组子集?
【发布时间】:2012-06-20 20:40:30
【问题描述】:

我有一个 800x800 数组,我想只分析它外部的元素。 我需要一个没有切片 [5:-5,5:-5] 元素的新数组。 它不一定要返回二维数组,平面数组或列表也可以。 示例:

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() 但它似乎一次只适用于一个轴。 我想知道是否有更直接的方法来做到这一点。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    您可以使用布尔数组以任何您喜欢的方式索引您的数组。这样,如果您不想更改原始数组中的任何值,就不必更改。这是一个简单的例子:

    >>> 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 - 是的,这是一种很好的做事方式:)
    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-11
      • 2013-10-30
      • 1970-01-01
      • 2021-06-26
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多