将numpy矩阵的几列归零

时间:2018-04-04 05:04:55

标签: python numpy

我有一个numpy矩阵10x10并希望在某些列中为零值,相应于向量[1,0,0,0,0,1,0,0,1,0] - 如何以最好的方式做到这一点性能?使用其他python库也是可以接受的,如果工作得更好

1 个答案:

答案 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微秒 - 考虑到阵列有多小,这就是你应该期待的。