与这个问题相关,我遇到了一个关于布尔数组和广播的索引行为,我不理解。我们知道可以使用整数索引和广播在2维中索引NumPy数组。这在文档中有说明:
a = np.array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
b1 = np.array([False, True, True])
b2 = np.array([True, False, True, False])
c1 = np.where(b1)[0] # i.e. [1, 2]
c2 = np.where(b2)[0] # i.e. [0, 2]
a[c1[:, np.newaxis], c2] # or a[c1[:, None], c2]
array([[ 4, 6],
[ 8, 10]])
然而,对于布尔数组不适用同样的方法。
a[b1[:, None], b2]
IndexError: too many indices for array
替代方案numpy.ix_
适用于整数数组和布尔数组。这似乎是因为ix_
对布尔数组执行特定的操作,以确保一致的处理。
assert np.array_equal(a[np.ix_(b1, b2)], a[np.ix_(c1, c2)])
array([[ 4, 6],
[ 8, 10]])
所以我的问题是:为什么使用整数可以实现广播,而使用布尔数组却不能呢?这种行为是否有文档记录?还是我误解了更基本的问题?
np.flatnonzero(ar)
,然后再用于索引。因此,np.flatnonzero(b1[:, np.newaxis])
与np.flatnonzero(b1)[:, None]
不等价。 - Divakarnp.nonzero(b1[:,None])
和np.nonzero(b2)
在它们各自的元组的每个元素上与对方不可广播,而不是直接使用整数数组进行索引,这些整数数组可以与np.ix_(c1, c2)
广播。 - Divakar