【问题标题】:Slice an array to exclude a single element对数组进行切片以排除单个元素
【发布时间】:2019-10-23 22:43:25
【问题描述】:

我想对一个 numpy 数组进行切片,以便从中排除单个元素。

例如,像这样:

a = numpy.array([1,2,3,4,5])
b = a[0:1::3:4]
b = [1 2 4 5]

只是这不起作用,所以要么我做错了什么,要么不可能。

【问题讨论】:

  • 不过,据称重复的问题专门针对整体产品。
  • 重复错误:stackoverflow.com/questions/48061508/…。此海报不想要产品。
  • 有一个np.delete 函数。在内部,虽然它只会加入两个单独的切片。你不能只用一片来做到这一点。结果必须是copy,而不是view
  • @hpaulj :我不能再投票了。请作为stackoverflow.com/questions/19286657/…的副本关闭它
  • 可以一次删除几十万个元素吗?例如,您可能想要设置一个掩码,为保留值设置 True,为删除设置 False,然后执行一个布尔索引。一次删除一项不会有效率,即使使用列表也是如此。

标签: python arrays numpy slice numpy-ndarray


【解决方案1】:
import numpy as np

a = np.array([1,2,3,4,5])
result = np.delete(a,2)
result = [1,2,4,5]

【讨论】:

    【解决方案2】:

    您需要执行以下操作

     a =  np.array([1,2,3,4,5])
     b = a[:2]
     c = a[3:]
     print ( b )
     print ( c )
     z= np.concatenate((b,c),axis=None)
     print ( z )
    
    Output:
    [1 2]
    [4 5]
    [1 2 4 5]
    

    因此,这里除了 3 之外的所有内容都在新的 numpy.ndarray z 中。 另一种方法是使用 np.delete 函数,如答案之一所示,您可以在 [] 中提供要删除的索引列表,其中列表包含要删除的逗号分隔索引。

       a =  np.array([15,14,13,12,11])
       a4=np.delete(a,[1,4])
       print(a4)
    
       output is :
       [15 13 12]
    

    【讨论】:

      【解决方案3】:

      如果您要一次重复“删除”一项,我建议使用布尔掩码:

      In [493]: a = np.arange(100)                                                                           
      In [494]: mask = np.ones(a.shape, dtype=bool)                                                          
      In [495]: for i in [2,5,9,20,3,26,40,60]: 
           ...:     mask[i]=0 
           ...: a1 = a[mask]                                                                                 
      In [496]: a1.shape                                                                                     
      Out[496]: (92,)
      

      这实际上是 np.delete 在给定一个删除列表或数组时所做的

      In [497]: a2 = np.delete(a, [2,5,9,20,3,26,40,60])                                                     
      In [498]: np.allclose(a1,a2)                                                                           
      Out[498]: True
      

      对于单个元素,连接两个切片 - 通过连接或复制到正确大小的 result 数组。在所有情况下,我们都必须创建一个新数组。

      一个或多个排除,您寻求对原始元素的不连续选择。这不能用view 产生,它使用shapestrides 来选择原始的常规子集。

      【讨论】:

      • 我意识到这超出了我原来问题的范围,但是在第一个面具之后我需要做更多的事情,例如从数组中删除其他元素。这意味着我每次都需要创建一个新的面具,不是吗?另外,我也在每一步都修改数组,所以用几个 0 的掩码掩盖原始数组也不起作用。
      • 你还用数组做什么?我不确定 numpy 数组是否适合您。
      【解决方案4】:

      你总是可以使用切片集

      b = a[:2]+a[3:]
      

      将返回 [1, 2, 4, 5]

      对于一个 numpy 返回值,你可以做 2 个切片并连接结果。

       b = a[3:]
       c = a[:2]
       numpy.concatenate([c,b])
      

      会回来

      array([1, 2, 4, 5])
      

      【讨论】:

      • 从您返回的数据来看,您使用的是 Python 列表而不是 numpy 数组。是这样吗?
      • + 是列表的连接,但不适用于数组。
      • 我唯一的问题是concatenate和delete一样复杂,我需要在大数组上做很多次。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 2016-04-11
      • 2021-02-06
      • 2016-10-11
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多