有可能将这个numpy数组比较向量化吗



我在Python中有这两个numpy数组:

a = np.array(sorted(np.random.rand(6)*6)) # It is sorted.
b = np.array(np.random.rand(3)*6)

假设阵列是

a = array([0.27148588, 0.42828064, 2.48130785, 4.01811243, 4.79403723, 5.46398145])
b = array([0.06231266, 1.64276013, 5.22786201])

我想生成一个包含索引的数组,其中a<=,而不是b中的每个元素,也就是说,我想要这个:

np.argmin(np.array([a<b_i for b_i in b]),1)-1

其产生array([-1, 1, 4]),意味着b[0]<a[0]a[1]<b[1]<a[2]a[4]<b[2]<a[5]

有没有任何本地numpy快速矢量化的方法可以避免for循环?

要回答特定的问题,即获得等效np.array([a<b_i for b_i in b]的矢量化方法,您可以利用广播,在这里,您可以使用:

a[None, ...] < b[..., None]

因此:

>>> a[None, ...] < b[..., None]
array([[False, False, False, False, False, False],
[ True,  True, False, False, False, False],
[ True,  True,  True,  True,  True, False]])

重要的是,对于广播:

>>> a[None, ...].shape,  b[..., None].shape
((1, 6), (3, 1))

这是官方numpy文档的链接,以了解广播。一些相关花絮:

在两个数组上操作时,NumPy会比较它们的形状元素方面。它从尾部(即最右侧(尺寸开始然后向左走。时两个维度兼容

  1. 它们是相等的,或者

  2. 其中一个是1

。。。

当比较的任一维度是一个维度时,将使用另一个维度。在里面换句话说,尺寸为1的尺寸被拉伸或"复制"以匹配另一个。

编辑

正如你的问题下的评论所指出的,使用完全不同的方法在算法上比你自己的暴力解决方案要好得多,即利用二进制搜索,使用np.searchsorted

最新更新