这是一种方式:
_, c = np.nonzero(b == a[:, None])
assert np.allclose(b[c], a)
请注意,它将b[c] 断言为a 而不是b[c-1]。
工作:
b == a[:, None] 行返回一个形状为 n x m 的布尔数组,其中每一行将a 的第行索引元素与b 的所有元素进行比较。这就是为什么在对应的列索引col 中有True 的行中有m 布尔元素,其中来自a 的元素等于b[col]。这使用broadcasting 进行元素比较。
这是一个小插图:
>>> m = 5
>>> n = 10
>>> a = np.random.randint(1, m+1, size=n)
>>> b = np.random.permutation(m) + 1
>>> a
array([5, 4, 2, 1, 4, 2, 5, 4, 5, 2])
>>> b
array([3, 5, 1, 2, 4])
>>> b == a[:, None]
array([[False, True, False, False, False],
[False, False, False, False, True],
[False, False, False, True, False],
[False, False, True, False, False],
[False, False, False, False, True],
[False, False, False, True, False],
[False, True, False, False, False],
[False, False, False, False, True],
[False, True, False, False, False],
[False, False, False, True, False]])
在应用 np.nonzero() 时,在此 2D 布尔数组上,您将获得 2 个 1D 数组,其中传递数组具有 True 元素的行和列索引,即,布尔数组的每个(i[k], j[k]) 位置都有True。在这里,我将行和列索引数组显示为i 和j。
>>> i, j = np.nonzero(b == a[:, None])
>>> i
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> j
array([1, 4, 3, 2, 4, 3, 1, 4, 1, 3])
在某种程度上,j 列给出了如何通过使用j 索引b 来获得数组a。
>>> b[j]
array([5, 4, 2, 1, 4, 2, 5, 4, 5, 2])
>>> a
array([5, 4, 2, 1, 4, 2, 5, 4, 5, 2])
基本上,a 中的元素来自 set b。上面的思路只是比较a中的每个元素在b中出现的位置,然后得到对应的索引。