我有一个n * m数组“ a”和另一个一维数组“ b”,例如:
a = array([[ 51, 30, 20, 10],
[ 10, 32, 65, 77],
[ 15, 20, 77, 30]])
b = array([10, 15, 20, 30, 32, 51, 65, 77])
我想用元素所在的相应索引“ b”替换“ a”中的所有元素。在上述情况下,我希望输出为:
a = array([[ 5, 3, 2, 0],
[ 0, 4, 6, 7],
[ 1, 2, 7, 3]])
请注意,在实际应用中,我的数组很大,超过3万个元素,其中有数千个。我已经尝试过for循环,但是这些计算需要很长时间。我还尝试了类似的迭代方法,并使用list.index()来获取索引,但这也花费了太多时间。
谁能帮助我先确定出现在“ b”中的“ a”元素的“ b”索引,然后构造更新的“ a”数组?
谢谢。
仅因为评论太长而将其发布为答案。它支持上面发布的orlp的解决方案。Numpy的向量化避免了显式循环,但这显然不是最佳方法。请注意,Numpy的searchsorted仅适用于b排序时显示的情况。
import timeit
import numpy as np
a = np.random.randint(1,100,(1000,1000))
b = np.arange(0,1000,1)
def o1():
lo = min(a.min(), b.min())
hi = max(a.max(), b.max())
lut = np.zeros(hi - lo + 1, dtype=np.int64)
lut[b - lo] = np.arange(len(b))
a2 = lut[a - lo]
return a2
def o2():
a2 = a.copy()
fu = np.vectorize(lambda i: np.place(a2, a2==b[i], i))
fu(np.arange(0,len(b),1))
print(timeit.timeit("np.searchsorted(b, a)", globals=globals(), number=2))
print(timeit.timeit("o1()", globals=globals(), number=2))
print(timeit.timeit("o2()", globals=globals(), number=2))
版画
0.061956800000189105
0.012765400000716909
2.220097600000372
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句