如何在没有for循环的情况下在测试数组的每个元素上使用numpy?

How to use numpy where on each element of test array without a for-loop?

我想在例程中使用 numpy 函数而不使用 for 循环。考虑以下示例:

import numpy as np

data = np.linspace(1, 10, 10).astype(int) 
test_elements = np.array([1, 2])
for test_elem in test_elements:
    print(np.where(test_elem == data))

...

(array([0]),)
(array([1]),)

我已阅读其他帖子和 numpy 文档。常见的建议似乎是使用 np.roll 滚动 test_elements,或使用其他技巧,例如步幅(我不完全理解)。我认为使用 np.vectorize 来向量化函数可能更容易,但我觉得这对问题来说太过分了,必须有一个更简单的解决方案。任何指导将不胜感激?

这是使用 .outernp.split 的一种方法,我已经使示例更有趣了。

data = np.linspace(1, 5, 10).astype(int) 
test_elements = np.array([1, 2, 4, 6])
y, x = np.where(np.equal.outer(test_elements,data))
np.split(x, y.searchsorted(np.arange(1,test_elements.size)))
# [array([0, 1, 2]), array([3, 4]), array([7, 8]), array([], dtype=int64)]

一些解释:

np.equal.outer(test_elements,data)

相同
 test.elements[:,None] == data[None,:]

所以这是一个二维布尔数组,其行等于您的 for 循环中出现的布尔数组 test_elem == data

where returns 两个索引数组由此而来,每个坐标一个。 x 是快速变化的坐标,等于 for 循环 returns 的 1d where 的值,但它们都粘在一起成为一个长向量。 y是慢变坐标,它的值是有序的,可以用来分组/拆分xsearchsorted 可能不是最有效的方法,但它很简单并且可以正确处理空行。