【问题标题】:Why do we get such a result for double boolean indexing in Numpy?为什么我们在 Numpy 中得到这样的双布尔索引结果?
【发布时间】:2018-12-13 01:58:27
【问题描述】:

我对最后一个表达式的结果感到惊讶?

>>> from numpy import array, arange
>>> a = arange(12).reshape(3,4)
>>> b1 = array([False,True,True])             # first dim selection
>>> b2 = array([True,False,True,False])       # second dim selection
>>>
>>> a[b1,:]                                   # selecting rows
array([[ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>>
>>> a[b1]                                     # same thing
array([[ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>>
>>> a[:,b2]                                   # selecting columns
array([[ 0,  2],
       [ 4,  6],
       [ 8, 10]])
>>>
>>> a[b1,b2]                                  # a weird thing to do
array([ 4, 10])

我预计:

array([[ 4,  6],
       [ 8, 10]])

你有什么解释为什么会这样吗?

【问题讨论】:

  • a[b1, :][:, b2] 会产生您预期的输出。并查看NumPy User GuideNumPy Reference 中的索引文档。
  • 是的,我测试过: >>> a[:,b2][b1] array([[ 4, 6], [ 8, 10]]) 和 >>> a[b1 ][:,b2] 数组([[ 4, 6], [ 8, 10]])

标签: python arrays numpy indexing


【解决方案1】:

让我们从你的数组开始:

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

您当前的索引逻辑等同于以下内容:

a[[1, 2], [0, 2]]  # array([ 4, 10])

坚持二维,NumPy 将此解释为索引 dim1-indices [1, 2] 和 dim2-indices [0, 2],或坐标 (1, 0)(2, 2)。这里不涉及广播。

要允许使用布尔数组进行广播,您可以使用numpy.ix_

res = a[np.ix_(b1, b2)]

print(res)

array([[ 4,  6],
       [ 8, 10]])

ix_ 的神奇作用在docs 中有所说明:“布尔序列将被解释为对应维度的布尔掩码(相当于传入np.nonzero(boolean_sequence))。”

print(np.ix_(b1, b2))

(array([[1],
        [2]], dtype=int64), array([[0, 2]], dtype=int64))

附带说明,如果您有整数索引,则可以使用更直接的方法:

b1 = np.array([1, 2])
b2 = np.array([0, 2])

a[b1[:, None], b2]

另请参阅:related question,了解为什么此方法不适用于布尔数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    相关资源
    最近更新 更多