这是一个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]
我问的原因是我正在处理的实际数组是数千个条目,因此我想优化我的代码。
答案 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
)