这里有两个numpy
选项np.in1d
这是从基础python in
矢量化版本。当阵列是大的,第一个选项显示了一些加速:
选项一个(快速一个):
np.in1d(A, L).reshape(A.shape).astype(int)
选择二(慢一个):
np.apply_along_axis(np.in1d, 0, A, L).astype(int)
计时:
A = np.random.randint(0, 10, (1000, 1000))
L = [3,4,5]
def loop():
B = np.zeros(A.shape)
for e in L:
B[A==e] = 1
return B
%timeit np.in1d(A, L).reshape(A.shape).astype(int)
# 100 loops, best of 3: 6.4 ms per loop
%timeit loop()
# 100 loops, best of 3: 16.8 ms per loop
%timeit np.apply_along_axis(np.in1d, 1, A, L).astype(int)
# 10 loops, best of 3: 21.5 ms per loop
%timeit np.apply_along_axis(np.in1d, 0, A, L).astype(int)
# 10 loops, best of 3: 35.1 ms per loop
结果检查:
B1 = loop()
B2 = np.apply_along_axis(np.in1d, 0, A, L).astype(int)
B3 = np.apply_along_axis(np.in1d, 1, A, L).astype(int)
B4 = np.in1d(A, arrL).reshape(A.shape).astype(int)
(B1 == B2).all()
# True
(B1 == B3).all()
# True
(B1 == B4).all()
# True
我时序结果提供了不同的叙事。我在anaconda中使用python 3.5和numpy 1.10.4,原始循环大约比使用in1d快3倍。编辑:我现在看到你使用了一个1000x1000的随机矩阵。我将用相同大小的矩阵进行重新测试。 –
@ HAL9001我刚刚测试了python 3,我得到了相当一致的结果。第一个np.in1d选项更快。你正在测试的阵列有多大? – Psidom
Psidom的结果在使用1000x1000时得到确认。 –