【问题标题】:NumPy 1D array slicingNumPy 一维数组切片
【发布时间】:2015-01-29 07:03:54
【问题描述】:

我有一个像这样的 NumPy 数组:

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 个值,但是否可以使用类似的语法跳过多个值?

感谢您的帮助!

【问题讨论】:

  • 是要跳过特定位置的数字(不管它的值),还是要跳过具有特定值的数字?
  • 我想跳过某些位置的数字。谢谢!

标签: python arrays numpy slice


【解决方案1】:

你可能想要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”运算符检查每个值是不高效的。无论如何感谢您的帮助!
  • 如果子数组可以用切片 a[start:stop:step] 进行索引,您只能获取视图(即没有副本),这不是您的情况。无论如何都会制作副本,np.delete 是最快的制作方法。
【解决方案2】:

我看到两个选项:

  1. 如果你想得到一个可以在多个数组上使用的索引向量:

    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]
    

    这个输出:

    array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
    
  2. 使用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)
    

    这个输出:

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

【讨论】:

  • 在涉及 numpy 数组时请尽量避免 python 循环。使用np.in1d 可以更有效地计算idx_inv
【解决方案3】:

使用boolean or mask index array

>>> 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] 那样直接使用布尔数组或掩码数组。
  • @vitmol,根据需要更改值。例如:a[(a != 4) & (a != 0)]a[a < 3]
  • Falsetru 您建议根据元素的值查找跳过元素的索引。这非常简单,适用于其他情况。在我的情况下,我知道我想跳过哪些值。 (例如跳过 4,5,10,11 等)。但它基于位置,而不是基于价值。我只需要一个快速的解决方案来执行这样的切片。感谢您的帮助!
【解决方案4】:

你可以使用Boolean array indexing:

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 更改为产生布尔数组的其他条件。

【讨论】:

    猜你喜欢
    • 2021-11-23
    • 2021-03-19
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 2019-05-21
    相关资源
    最近更新 更多