Numpy教程 - 布尔索引

4
阅读Numpy快速教程时,我无法理解这句话。
a = np.arange(12).reshape(3,4)
b1 = np.array([False,True,True]) 
b2 = np.array([True,False,True,False])
>>> a[b1,b2]  
array([ 4, 10])

为什么 a[b1,b2] 的结果是 array([4,10]) 而不是 array([[4,6],[8,10]])
1个回答

5

你之所以在那里执行 整数数组索引,是因为这样做。

在内部,这些索引是从布尔数组计算出来的 -

In [72]: idx1 = np.flatnonzero(b1)

In [73]: idx2 = np.flatnonzero(b2)

In [75]: idx1
Out[75]: array([1, 2])

In [76]: idx2
Out[76]: array([0, 2])

然后,对每组索引进行整数数组索引,使用来自索引数组的每个元素。
In [77]: a[1,0] # 1 from idx1[0], 0 from idx2[0]
Out[77]: 4

In [78]: a[2,2] # 2 from idx1[1], 2 from idx2[1]
Out[78]: 10

为了实现类似 MATLAB 的块提取,我们需要使用开放数组并索引到每个轴/维度。在 NumPy 中创建这样的开放数组,我们使用 np.ix_
In [89]: np.ix_(b1,b2)
Out[89]: 
(array([[1],
        [2]]), array([[0, 2]]))

In [90]: a[np.ix_(b1,b2)]
Out[90]: 
array([[ 4,  6],
       [ 8, 10]])

@JeongYeojin 如果这个回答解决了你的问题,请考虑点击解决方案旁边的空心勾选来接受它,更多信息请参见此处 - https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work - Divakar

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