我正在寻找一种有效的方法来计算numpy数组中每个元素的“order”,其中“order”定义为等于该元素的前面元素的数量。示例:
order([4, 2, 3, 2, 6, 4, 4, 6, 2, 4])
[0 0 0 1 0 1 2 1 2 3]
字符串
目前的解决方案在纯Python中循环,速度不够快:
def order(A):
cnt = defaultdict(int)
O = np.zeros_like(A)
for i, r in enumerate(A):
O[i] = cnt[r]
cnt[r] += 1
return O
型
我使用order
来实现scatter
:
def scatter(A, c):
R = A % c
I = c * order(R) + R
B = np.full(np.max(I) + 1, -1)
B[I] = A
return B
型
这对多线程很有用。例如,如果分散的数组包含要写入的地址,那么并行处理数组的两个线程将不会看到相同的地址。
问题是,是否有我遗漏的numpy内置函数可以用来使order
更快,并删除显式循环?
1条答案
按热度按时间2w2cym1i1#
由于你所做的本质上是一个Pandas cumcount,而Pandas在内部使用NumPy,一个想法是看看他们是如何实现cumcount的,并做同样的事情。
如果你读了Pandas的cumcount代码,它在内部是这样实现的:
run
)rep
)out
)out[run]
)rep
。下面是如何在不依赖任何Pandas的情况下做同样的事情。
字符串
我发现这对于1000个元素和更大的数组来说快了大约10倍。