两个不同大小的向量之间的广播比较

时间:2015-03-12 17:25:15

标签: python numpy

所以我有一个向量1x4 cumpr

In [119]:

cumpr
Out[119]:
array([ 0.30769231,  0.38461538,  0.53846154,  1.        ])

和1x10向量 r

In [120]:

r
Out[120]:
array([ 0.90737839,  0.05419125,  0.14056591,  0.73179618,  0.34456476,
        0.27682039,  0.74046728,  0.93973422,  0.67263953,  0.44141488])

对于 r 中的每个元素,我想执行以下操作(例如, r 中的第一个元素):

In [86]:

np.nonzero(cumpr > r[0])[0][0]
Out[86]:
3

即,返回 cumpr 中第一个元素的索引,其中该元素大于 r [0]

但是有没有办法在没有循环的情况下为 r 中的所有元素执行此操作?如果我尝试播放

cumpr > r

我刚收到错误。

谢谢

1 个答案:

答案 0 :(得分:3)

IIUC,您只需使用np.searchsorted

>>> np.searchsorted(cumpr, r)
array([3, 0, 0, 3, 1, 0, 3, 3, 3, 2])

完整性检查:

>>> ix = np.searchsorted(cumpr, r)
>>> cumpr[ix]
array([ 1.        ,  0.30769231,  0.30769231,  1.        ,  0.38461538,
        0.30769231,  1.        ,  1.        ,  1.        ,  0.53846154])
>>> cumpr[ix] >= r
array([ True,  True,  True,  True,  True,  True,  True,  True,  True,  True], dtype=bool)

请注意,具有“向量1x4”和“1x10向量”;你有两个一维数组,形状(4,)(10,)。这对于理解广播版本非常重要:

>>> (cumpr > r[:,None]).argmax(1)
array([3, 0, 0, 3, 1, 0, 3, 3, 3, 2])

通过添加单个元素轴来构建中间数组。