我想知道如果没有迭代for循环来做这样的事情是否可能:
a = np.array([[1, 2, 5, 3, 4],
[4, 5, 6, 7, 8]])
cleaver = np.argmax(a == 5, axis=1) # np.array([2, 1])
foo(a, cleaver)
>>> np.array([False, False, True, True, True],
[False, True, True, True, True])
有没有办法通过切片或其他非迭代函数来实现这一目的?我正在使用的数组非常大,并且逐行迭代这些数组非常昂贵。
答案 0 :(得分:2)
您可以使用一些broadcasting
魔法 -
cleaver[:,None] <= np.arange(a.shape[1])
示例运行 -
In [60]: a
Out[60]:
array([[1, 2, 5, 3, 4],
[4, 5, 6, 7, 8]])
In [61]: cleaver
Out[61]: array([2, 1])
In [62]: cleaver[:,None] <= np.arange(a.shape[1])
Out[62]:
array([[False, False, True, True, True],
[False, True, True, True, True]], dtype=bool)