索引所有*除了*python中的一个项目

cho*_*raf 90 python indexing numpy list

有没有一种简单的方法来索引列表(或数组,或其他)的所有元素,除了特定的索引?例如,

  • mylist[3] 将返回位置3的项目

  • milist[~3] 将返回除3之外的整个列表

tom*_*m10 89

对于列表,您可以使用列表comp.例如,要制作没有第3个元素b的副本a:

a = range(10)[::-1]                       # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
b = [x for i,x in enumerate(a) if i!=3]   # [9, 8, 7, 5, 4, 3, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud)

这是非常通用的,可以用于所有迭代,包括numpy数组.如果替换[](),b则将是迭代器而不是列表.

或者您可以使用以下方式执行此操作pop:

a = range(10)[::-1]     # a = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
a.pop(3)                # a = [9, 8, 7, 5, 4, 3, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud)

numpy中,您可以使用布尔索引来执行此操作:

a = np.arange(9, -1, -1)     # a = array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
b = a[np.arange(len(a))!=3]  # b = array([9, 8, 7, 5, 4, 3, 2, 1, 0])
Run Code Online (Sandbox Code Playgroud)

通常,它将比上面列出的列表理解快得多.


小智 48

>>> l = range(1,10)
>>> l
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l[:2] 
[1, 2]
>>> l[3:]
[4, 5, 6, 7, 8, 9]
>>> l[:2] + l[3:]
[1, 2, 4, 5, 6, 7, 8, 9]
>>> 
Run Code Online (Sandbox Code Playgroud)

也可以看看

解释Python的切片表示法

  • 列表的好答案。您也可以将其用于数组,但需要使用`numpy.concatenate`。 (2认同)

And*_*res 39

我找到的最简单的方法是:

mylist[:x]+mylist[x+1:]
Run Code Online (Sandbox Code Playgroud)

这将产生你mylist没有索引元素x.

  • @JackTC 不应该 (4认同)
  • 你必须记住索引是从0开始的,所以它工作正常. (2认同)
  • 在基本操作方面,Python 似乎有些过时了 (2认同)

Abh*_*jit 23

如果你正在使用numpy,最接近的,我能想到的是使用面具

>>> import numpy as np
>>> arr = np.arange(1,10)
>>> mask = np.ones(arr.shape,dtype=bool)
>>> mask[5]=0
>>> arr[mask]
array([1, 2, 3, 4, 5, 7, 8, 9])
Run Code Online (Sandbox Code Playgroud)

使用itertools没有可以实现类似的东西numpy

>>> from itertools import compress
>>> arr = range(1,10)
>>> mask = [1]*len(arr)
>>> mask[5]=0
>>> list(compress(arr,mask))
[1, 2, 3, 4, 5, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

  • 我可能会使用`np.arange(len(arr))!= 3`这样的掩码,因为这样可以将其内联,例如`arr [〜(np.arange(len(arr))== 3)] `或其他。 (2认同)

brn*_*rnl 9

使用np.delete!它实际上并没有就地删除任何内容

例子:

import numpy as np
a = np.array([[1,4],[5,7],[3,1]])                                       

# a: array([[1, 4],
#           [5, 7],
#           [3, 1]])

ind = np.array([0,1])                                                   

# ind: array([0, 1])

# a[ind]: array([[1, 4],
#                [5, 7]])

all_except_index = np.delete(a, ind, axis=0)                                              
# all_except_index: array([[3, 1]])

# a: (still the same): array([[1, 4],
#                             [5, 7],
#                             [3, 1]])
Run Code Online (Sandbox Code Playgroud)


Vla*_*den 8

我将提供一种功能性(不可变)的方法来做到这一点。

  1. 标准且简单的方法是使用切片:

    index_to_remove = 3
    data = [*range(5)]
    new_data = data[:index_to_remove] + data[index_to_remove + 1:]
    
    print(f"data: {data}, new_data: {new_data}")
    
    Run Code Online (Sandbox Code Playgroud)

    输出:

    data: [0, 1, 2, 3, 4], new_data: [0, 1, 2, 4]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用列表理解:

    data = [*range(5)]
    new_data = [v for i, v in enumerate(data) if i != index_to_remove]
    
    print(f"data: {data}, new_data: {new_data}") 
    
    Run Code Online (Sandbox Code Playgroud)

    输出:

    data: [0, 1, 2, 3, 4], new_data: [0, 1, 2, 4]
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用过滤功能:

    index_to_remove = 3
    data = [*range(5)]
    new_data = [*filter(lambda i: i != index_to_remove, data)]
    
    Run Code Online (Sandbox Code Playgroud)

    输出:

    data: [0, 1, 2, 3, 4], new_data: [0, 1, 2, 4]
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使用掩蔽。屏蔽由标准库中的itertools.compress函数提供:

    from itertools import compress
    
    index_to_remove = 3
    data = [*range(5)]
    mask = [1] * len(data)
    mask[index_to_remove] = 0
    new_data = [*compress(data, mask)]
    
    print(f"data: {data}, mask: {mask}, new_data: {new_data}")
    
    Run Code Online (Sandbox Code Playgroud)

    输出:

    data: [0, 1, 2, 3, 4], mask: [1, 1, 1, 0, 1], new_data: [0, 1, 2, 4]
    
    Run Code Online (Sandbox Code Playgroud)
  5. 使用Python 标准库中的itertools.filterfalse函数

    from itertools import filterfalse
    
    index_to_remove = 3
    data = [*range(5)]
    new_data = [*filterfalse(lambda i: i == index_to_remove, data)]
    
    print(f"data: {data}, new_data: {new_data}")
    
    Run Code Online (Sandbox Code Playgroud)

    输出:

    data: [0, 1, 2, 3, 4], new_data: [0, 1, 2, 4]
    
    Run Code Online (Sandbox Code Playgroud)