代码之家  ›  专栏  ›  技术社区  ›  orange

按整数和布尔numpy切片组合

  •  0
  • orange  · 技术社区  · 3 年前

    我正在寻找一种组合两个索引数组的方法 b 和 i (布尔型之一,整数型之一)来切片另一个数组 x .

    x = np.array([5.5, 6.6, 3.3, 7.7, 8.8])
    i = np.array([1, 4])
    b = np.array([True, True, False, False, False])
    

    结果数组应为 x == [6.6] 因为它的索引依据 我 ( i[0] )和中的值 b[1] .

    换句话说,我正在寻找一种表达方式 x[i & b] 具有 我 是一个整数数组。我知道如何将布尔索引数组转换为整数索引数组( np.where(b) ),但这只会将问题转移到组合两个整数索引数组上,我也没有解决方案。

    显然,后续切片不起作用(即。 x[i][b] 或者反之亦然),因为维度在每次单独切片之后发生变化。

    如有任何帮助,我们将不胜感激。

    1 回复  |  直到 3 年前
        1
  •  1
  •   Mateen Ulhaq    3 年前

    一 O(n) 方法是转换索引数组 i 到布尔数组和 然后 接受 & :

    b_i = np.zeros_like(b)
    b_i[i] = True
    
    output = x[b_i & b]
    

    这种方法推广到所有逻辑运算符(例如。 & , | , ...).


    更节省内存的方法是应用相同的索引操作 我 到 b :

    output = x[i][b[i]]
    
    # For the example in the question,
    # x[i] == [6.6, 8.8]
    # b[i] == [True, False]