我有一个numpy矩阵10x10并希望在某些列中为零值,相应于向量[1,0,0,0,0,1,0,0,1,0] - 如何以最好的方式做到这一点性能?使用其他python库也是可以接受的,如果工作得更好
答案 0 :(得分:0)
最简单的方法是乘法运算。将值乘以0将其归零,并将值乘以1无效,因此将矩阵与向量相乘将完全符合您的要求:
m = np.random.randint(1, 10, (10,10))
v = np.array([1,0,0,0,0,1,0,0,1,0])
print(m * v)
输出:
[[7 0 0 0 0 5 0 0 5 0]
[8 0 0 0 0 5 0 0 6 0]
[1 0 0 0 0 5 0 0 9 0]
[1 0 0 0 0 6 0 0 1 0]
[5 0 0 0 0 8 0 0 5 0]
[5 0 0 0 0 4 0 0 9 0]
[1 0 0 0 0 3 0 0 9 0]
[1 0 0 0 0 9 0 0 8 0]
[6 0 0 0 0 4 0 0 6 0]
[1 0 0 0 0 6 0 0 1 0]]
您担心乘法可能太慢,并想通过选择知道如何做到这一点。这也很简单:
bv = v.astype(np.bool)
m[:,bv] = 0
print(m)
或者,您可以使用astype
代替bv = v == 1
,但由于您最终得到的是完全相同的bool数组,我无法想象这会产生影响。
那么,哪个最快?
In [123]: %timeit m*v
2.87 µs ± 53.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [124]: bv = v.astype(np.bool)
In [125]: %timeit m[:,v.astype(np.bool)]
5.02 µs ± 161 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [127]: bv = v==1
In [128]: %timeit m[:,v.astype(np.bool)]
5.03 µs ± 134 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
所以,"慢"方式实际上只有不到三分之二的时间。
此外,无论你怎么做,它只需要5微秒 - 考虑到阵列有多小,这就是你应该期待的。