2016-07-26 3 views
1

ビット迷惑私はこれを自分で得ることができなかったので、ここに行く。ナンキー配列軸をゼロにするPythonicの方法

は私がこの配列内の列をゼロますが、元の配列を維持したいような状況にいる私は2次元のnumpyの配列

import numpy as np 
a = np.array([[1,2,3],[4,5,6],[7,8,9]]) 

を持っていると言います。私は

array([[1, 0, 3], 
     [4, 0, 6], 
     [7, 0, 9]]) 

を取得するために

b = a.copy() 
b[:,1] = 0 

によってこれを行うことができますか、私は一連の列をゼロにしたい場合は、私が行うことができます

b = a.copy() 
b[:,[0,3]] = 0 

array([[0, 2, 0], 
     [0, 5, 0], 
     [0, 8, 0]]) 
取得します

b配列は1つしか使用されずに破棄されます。

1ライナーとして行うことができるこれ以上のpythonicの方法はありますか?私は0の値を持つb配列にプロットルーチンを渡したいだけです。その後は必要ありません。基本的には、私はプロット関数を呼び出す前に余分な2行を持っていないことを望んでいます。

plotting_func(<numpy_magic_here>) 

代わりの

b = a.copy() 
b[:,1] = 0 
plotting_func(b) 

例えばbがゼロとして特定の列を設定するには、再び

+0

が、私は必ずしも簡単でより読みやすいワンライナーを考えることができますが... – Julien

+0

なぜあなたはゼロの軸とA' 'のコピーを作成したいのですか?あなたが気にしている軸(つまり、ゼロにしようとしていない軸)だけを渡すようにプロット関数を変更することは可能ですか?次に、関数呼び出しで簡単にスライスして実行できます。 – user2229219

+3

'' [:、[0以外の列]] 'をプロット関数に渡すことはできませんか? –

答えて

2

使用されることはありませんするだけのために、無効な要素のマスクを作成するためにnp.arangeを伴って含むnp.in1dを使用することができますこれは、入力配列と掛け合わされるとNumPy broadcastingを使用して無効な列を0に設定します。したがって、我々のようなので、ワンライナーの実装を持っているでしょう -

a*~np.in1d(np.arange(a.shape[1]),cols_to_be_reset) 

を別の方法として、1がそうのように、代わりに掛けるのを選択するnp.whereを使用することができます -

np.where(np.in1d(np.arange(a.shape[1]),cols_to_be_reset),0,a) 

これが意味するものではないことに注意してくださいパフォーマンスのために、しかし1ライナーのように。

サンプル実行 -

In [546]: a 
Out[546]: 
array([[1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9]]) 

In [547]: a*~np.in1d(np.arange(a.shape[1]),1) 
Out[547]: 
array([[1, 0, 3], 
     [4, 0, 6], 
     [7, 0, 9]]) 

In [548]: a*~np.in1d(np.arange(a.shape[1]),[0,2]) 
Out[548]: 
array([[0, 2, 0], 
     [0, 5, 0], 
     [0, 8, 0]]) 
+0

すごくありがとう!他のコメントのいくつかから判断すると良いと思われる。回答が受け入れられました。 – TJG

関連する問題