NumPy 1D数组切片

4

I have a NumPy array like:

a = np.array([1,2,3,4,0,0,5,6,7,8,0,0,9,10,11,12])

什么是选择除某些位置的值(在我的例子中是0)最有效的方法?

所以我需要得到一个数组:

[1,2,3,4,5,6,7,8,9,10,11,12]

我知道如何使用[::n]结构跳过一个第n个值,但是是否可能使用类似的语法跳过多个值?

感谢您的帮助!


你想要跳过特定位置的数字(无论其值如何),还是想要跳过具有特定值的数字? - Bolu
我想跳过某些位置的数字。谢谢! - Vitali Molchan
4个回答

4
您可能需要使用np.delete来实现此功能:
>>> np.delete(a, [4, 5, 10, 11])
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

谢谢!我看到np.delete的唯一问题是需要创建数组的副本。这可能不是很高效。此外,由于循环或迭代器,反向索引构建([x for x in range(len(a)) if x not in idx])也不是很高效。在我的情况下,数组的大小可以是数百万个值,这些值由几个符号分隔-->使用“if”运算符检查每个值不是很高效。无论如何,感谢您的帮助! - Vitali Molchan
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Jaime

2
我看到两个选择:
  1. If you want to get an index vector that you can use on multiple arrays:

    import numpy as np
    
    #your input
    a = np.array([1,2,3,4,0,0,5,6,7,8,0,0,9,10,11,12])
    #indices of elements that you want to remove (given)
    idx = [4,5,10,11]
    #get the inverted indices
    idx_inv = [x for x in range(len(a)) if x not in idx]
    a[idx_inv]
    

    This output:

    array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
    
  2. Use np.delete:

    import numpy as np
    
    #your input
    a = np.array([1,2,3,4,0,0,5,6,7,8,0,0,9,10,11,12])
    #indices of elements that you want to remove (given)
    idx = [4,5,10,11]
    
    np.delete(a,idx)
    

    This outputs:

    array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
    

1
请尽量避免在涉及到numpy数组时使用Python循环。可以使用np.in1d更高效地计算出idx_inv - Daniel

1
你可以使用 布尔数组索引
import numpy as np
a = np.array([1,2,3,4,0,0,5,6,7,8,0,0,9,10,11,12])
print a[a != 0]
# Output: [ 1  2  3  4  5  6  7  8  9 10 11 12]

你可以将a != 0更改为其他条件,这些条件会产生布尔数组。


1
使用布尔值或掩码索引数组
>>> a = np.array([1,2,3,4,0,0,5,6,7,8,0,0,9,10,11,12])
>>> a[a != 0]
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

谢谢!但我需要跳过某些位置的值。在我的例子中是“0”(只是举个例子),但它可以是任何值。因此,不能直接像a[a!=0]那样使用布尔或掩码数组。 - Vitali Molchan
@vitmol,请根据您的需求更改值。例如:a[(a != 4) & (a != 0)]a[a < 3] - falsetru
Falsetru提出了一种基于元素值查找跳过元素索引的方法。这非常直接,对于其他情况也有效。在我的情况下,我知道我想要跳过哪些值(例如跳过4、5、10、11等),但是它是基于位置而不是基于值。我只需要一个快速的解决方案来执行这样的切片操作。谢谢你的帮助! - Vitali Molchan

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