所以我有一个向量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
我刚收到错误。
谢谢
答案 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])
通过添加单个元素轴来构建中间数组。