numpy数组列表中的元素为零

时间:2017-11-24 02:45:22

标签: python numpy list-comprehension

这是一个MWE。

我有以下numpy数组列表。

 vectors = [np.array([ 0.       ,  0.8660254,  0.       ]),
 np.array([  1.10501514e-08,   8.64943091e-01,   4.32832253e-02]),
 np.array([  1.34263203e-08,   8.61698881e-01,   8.64582689e-02]),
 np.array([  2.35976215e-08,   8.56300871e-01,   1.29417208e-01]),
 np.array([  1.32175872e-08,   8.48762560e-01,   1.72052683e-01])]

目标:对于列表中的每个数组,我想为数组的值设置zero tolerance

我是这样做的

def set_zero(vector):
  ZERO_TOL = 1e-07
  vector[vector <= ZERO_TOL] = 0
  return vector

new_vecs = [set_zero(vector) for vector in vectors]

它给了我预期的结果。

问题:如果只使用set zero,有没有办法在没有list comprehension功能的情况下执行此操作?像下面这样......

一厢情愿

ZERO_TOL = 1e-07
new_vecs = [vector[vector <= ZERO_TOL] = 0 for vector in vecs]

我问的原因是我正在处理的实际数组是数千个条目,因此我想优化我的代码。

1 个答案:

答案 0 :(得分:2)

这可能就是你所追求的:

ZERO_TOL = 1e-07
new_vecs = [np.where(vector <= ZERO_TOL, 0, vector) for vector in vectors]

甚至更好地遵循@ sascha的建议:

vectors = np.array([[ 0.       ,  0.8660254,  0.       ],
 [  1.10501514e-08,   8.64943091e-01,   4.32832253e-02],
 [  1.34263203e-08,   8.61698881e-01,   8.64582689e-02],
 [  2.35976215e-08,   8.56300871e-01,   1.29417208e-01],
 [  1.32175872e-08,   8.48762560e-01,   1.72052683e-01]])

ZERO_TOL = 1e-07
new_vecs = np.where(vectors <= ZERO_TOL, 0, vectors)

另请注意,您的set_zero功能会更改原始vectors的值。如果这是你想要的行为(我怀疑为什么要创建一个新的引用new_vecs?)那么就这样做:

vectors[vectors <= ZERO_TOL] = 0

(假设您将列表转换为2d np.array