2017-11-24 3 views
0

여기 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] 

이렇게하면 원하는 결과를 얻을 수 있습니다.

질문 : list comprehension?을 사용하여 set zero 기능을 사용하지 않고이 작업을 수행 할 수있는 방법이 있습니까? 다음과 같은 뭔가 ...

희망찬 코드 :

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

물어 이유는 내가 일하고 실제 배열이 긴 항목의 수천 내가이 내 코드를 최적화하고 싶습니다 이유.

+2

은 속도가 중요하다 (당신은 2D np.array에 목록을 전환 가정) 왜 배열의 목록 대신 numpy 배열로 전체 구조를 유지하지 않을까요? – sascha

답변

2

이것은 당신이 무엇 아마 후 :

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의 값을 변경 참고 : @의 샤샤의 제안 다음에도 더 좋은

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

합니다. 이 원하는 행동 경우 (나는 그것이 다른 이유는 새 참조 new_vecs을 만드는 의심?) 그럼 그냥 수행

vectors[vectors <= ZERO_TOL] = 0 

+1

양극성 데이터의 경우 어딘가에'np.abs'가 있어야합니다. – f5r5e5d

+0

예, '벡터 [np.abs (벡터) <= ZERO_TOL] = 0'은이를 수행합니다. 감사 – minibuffer