2017-06-05 103 views
4

阅读Numpy快速教程,我无法理解这句话。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]])

回答

5

这是因为您在那里执行integer array indexing

在内部,索引从布尔数组计算 -

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风格的块提取,我们需要使用开放的数组和索引到每个轴/ dims中。要在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]]) 
+0

谢谢!!!!!现在我完全明白了。真的很感激它。谢谢 –

+0

@JeYongYeojin如果这解决了您的问题,请考虑通过点击解决方案旁边的空白勾来接受它,更多信息在这里 - https://meta.stackexchange.com/questions/5234/how-does-accepting-an-答案工作 – Divakar