【发布时间】:2018-12-13 03:23:27
【问题描述】:
与this question 相关,我通过布尔数组和广播遇到了我不理解的索引行为。我们知道可以使用整数索引和广播在二维中索引 NumPy 数组。这是在docs 中指定的:
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]])
所以我的问题是:为什么广播适用于整数,而不适用于布尔数组?这种行为是否记录在案?还是我误解了一个更根本的问题?
【问题讨论】:
-
AFAIK 在内部将这些布尔数组转换为等效的整数:
np.flatnonzero(ar)在用于索引之前。因此np.flatnonzero(b1[:, np.newaxis])将不等同于np.flatnonzero(b1)[:,None]。 -
我认为更多的是
np.nonzero(b1[:,None])和np.nonzero(b2)不能相互广播 w.r.t。其各自元组的每个元素,而不是直接输入整数数组以进行索引,这些数组可通过np.ix_(c1, c2)广播。 -
感谢您的接受,但@Divakar 是回答您实际问题的人,我真的只是想添加更多观点。我不想接受他的功劳,如果你不接受我的回答会更舒服。
-
@AndrasDeak 认为谁回答它并不重要,只要它回答了让 OP 满意的问题。如果是这样,将鼓励 OP 接受。
-
@Divakar 我一直努力做到公平。在这种情况下,谢谢,我将使用您的解决方案进行编辑以使其成为完整的答案(下次等到您自己发布答案;)
标签: python arrays numpy indexing array-broadcasting