如何在没有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
来向量化函数可能更容易,但我觉得这对问题来说太过分了,必须有一个更简单的解决方案。任何指导将不胜感激?
这是使用 .outer
和 np.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
是慢变坐标,它的值是有序的,可以用来分组/拆分x
。 searchsorted
可能不是最有效的方法,但它很简单并且可以正确处理空行。
我想在例程中使用 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
来向量化函数可能更容易,但我觉得这对问题来说太过分了,必须有一个更简单的解决方案。任何指导将不胜感激?
这是使用 .outer
和 np.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
是慢变坐标,它的值是有序的,可以用来分组/拆分x
。 searchsorted
可能不是最有效的方法,但它很简单并且可以正确处理空行。