Python 切片数组以排除单个元素

Python 切片数组以排除单个元素,python,arrays,numpy,slice,numpy-ndarray,Python,Arrays,Numpy,Slice,Numpy Ndarray,我想切片一个numpy数组,以便从中排除单个元素 例如,像这样: a = numpy.array([1,2,3,4,5]) b = a[0:1::3:4] b = [1 2 4 5] 只是这不起作用,所以要么我做错了什么,要么这是不可能的。您可以随时使用切片集 b = a[:2]+a[3:] 将返回[1,2,4,5] 对于numpy返回值,可以执行两个切片并连接结果 b = a[3:] c = a[:2] numpy.concatenate([c,b]) 会回来的 array([1,

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

例如,像这样:

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

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

您可以随时使用切片集

b = a[:2]+a[3:]
将返回[1,2,4,5]

对于numpy返回值,可以执行两个切片并连接结果

 b = a[3:]
 c = a[:2]
 numpy.concatenate([c,b])
会回来的

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

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

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
对于单个元素,is通过连接或复制到正确大小的结果数组来连接两个切片。在所有情况下,我们都必须制作一个新阵列


一个排除或多个排除,您将寻求对原始元素的不连续选择。这不能用视图生成,视图使用形状和步幅选择原始视图的常规子集。

您需要执行以下操作

 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]

从返回的数据来看,您使用的似乎是Python列表,而不是numpy数组。是这样吗?+是列表的连接,但不是数组。我唯一的问题是连接具有与删除相同的复杂性,我需要在大型数组上多次执行此操作。不过,据称这是重复的问题具体涉及到entires的乘积。坏的重复:。此海报不需要产品。有一个np.delete函数。虽然它只是在内部连接两个独立的片。你不能只吃一片。结果必须是副本,而不是视图。@hpaulj:我不能再投票了。请关闭它作为一个副本,你能一次删除几十万个元素吗?例如,您可能希望设置一个掩码,保留值为True,删除值为False,然后执行一个布尔索引。一次删除一个项目不会有效率,即使使用列表也是如此。我意识到这超出了我原来问题的范围,但在第一次屏蔽之后,我需要做进一步的操作,例如从数组中删除其他元素。这意味着我每次都需要创建一个新的面具,不是吗?此外,我还在每一步修改数组,因此用几个0来屏蔽原始数组也不起作用。你还用数组做什么?我不确定numpy阵列是否适合您。
import numpy as np

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