2017-11-24 14 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

これはあなたが後にあるか、おそらくです:

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

、さらにはよりよいサシャの提案@以下:

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 

+1

バイポーラデータの場合、おそらくどこかに 'np.abs'があります。 – f5r5e5d

+0

はい、'ベクトル[np.abs(ベクトル)<= ZERO_TOL] = 0'です。ありがとう – minibuffer

関連する問題