2017-06-12 7 views
3

私はPythonには新しく、Matricesを扱う際の問題に直面しています。Pythonで行列を扱う

私が行列を持っている、のは今

A = [1 0 0 2; 3 3 3 2; 3 3 0 2; 3 4 4 4] 

を言わせて、私は行列に最大回数を繰り返される要素を除いて、ゼロに等しい行列のすべての要素を作りたいです。 (この場合は3です)。

だから、期待される結果は、誰もがこのためのPythonコードで私を助けることができる場合、それは本当に参考になる、

B = [0 0 0 0; 3 3 3 0; 3 3 0 0;3 0 0 0] 

です。

答えて

1

これは、MATLABの構文で、 numpyでない:

np.matrixしかし
A = [1 0 0 2; 3 3 3 2; 3 3 0 2; 3 4 4 4] 

はでそれをエミュレート:

In [172]: A = np.matrix('1 0 0 2; 3 3 3 2; 3 3 0 2; 3 4 4 4') 
In [173]: A 
Out[173]: 
matrix([[1, 0, 0, 2], 
     [3, 3, 3, 2], 
     [3, 3, 0, 2], 
     [3, 4, 4, 4]]) 

あなたの仕事は2倍、最も頻繁要素、その後、他のすべてを置き換える知見です。どちらのアクションも、行列が2次元であるか、または配列ではなくmatrixであるかによって異なります。

In [174]: A1=A.A1 
In [175]: A1 
Out[175]: array([1, 0, 0, 2, 3, 3, 3, 2, 3, 3, 0, 2, 3, 4, 4, 4]) 

np.unique私たちの周波数カウントを与えることができますので、我々は(uniqueは1Dが必要)で最も頻度の高い値を微ことができます。

In [179]: u,c = np.unique(A1, return_counts=True) 
In [180]: u 
Out[180]: array([0, 1, 2, 3, 4]) 
In [181]: c 
Out[181]: array([3, 1, 3, 6, 3]) 
In [182]: np.argmax(c) 
Out[182]: 3 
In [183]: u[np.argmax(c)] 
Out[183]: 3 

私はDivakarがscipymodeの代わりに使用することを驚いていますunique。彼はuniqueを使うことの専門家の一員です。 :)

Divakarのnp.whereの使用は、置換を実行する最も簡単な方法です。ちょうどそれの楽しみのため

は、ここではマスクされた配列のアプローチです:

In [196]: np.ma.MaskedArray(A, A!=3) 
Out[196]: 
masked_matrix(data = 
[[-- -- -- --] 
[3 3 3 --] 
[3 3 -- --] 
[3 -- -- --]], 
       mask = 
[[ True True True True] 
[False False False True] 
[False False True True] 
[False True True True]], 
     fill_value = 999999) 
In [197]: _.filled(0) 
Out[197]: 
matrix([[0, 0, 0, 0], 
     [3, 3, 3, 0], 
     [3, 3, 0, 0], 
     [3, 0, 0, 0]]) 

またはインプレース変更:

In [199]: A[A!=3] = 0 
In [200]: A 
Out[200]: 
matrix([[0, 0, 0, 0], 
     [3, 3, 3, 0], 
     [3, 3, 0, 0], 
     [3, 0, 0, 0]]) 
+0

np.unique' 'に良いコール、numpyのにこだわります! – Divakar

+0

ありがとうhpaulj、これは非常に有用でした。私はMatlabで作業しており、Pythonも試してみるべきだと決めました。ご支援ありがとうございます。 –

2

Scipy's modeを使用してaxisNoneに設定して、配列全体で最も多く発生する番号を取得します。その数を入力配列と比較するとマスクが得られます。マスクを使用すると、残りの要素を入力配列/最も発生している数値と要素ごとの乗算で0に設定したり、np.whereを使用して選択したりできます。

したがって、1つのアプローチは、あろう -

from scipy.stats import mode 

most_occ_num = mode(A, axis=None)[0][0] 
out = most_occ_num*(A==most_occ_num) 

np.where有するアレイ出力のために -

out = np.where(A==most_occ_num,A,0) 

サンプルラン -

In [129]: A = np.matrix([[1, 0 ,0 ,2],[ 3, 3, 3, 2],[ 3 ,3 ,0 ,2],[ 3 ,4 ,4 ,4]]) 
In [140]: A 
Out[140]: 
matrix([[1, 0, 0, 2], 
     [3, 3, 3, 2], 
     [3, 3, 0, 2], 
     [3, 4, 4, 4]]) 

In [141]: most_occ_num = mode(A, axis=None)[0][0] 

In [142]: most_occ_num*(A==most_occ_num) 
Out[142]: 
matrix([[0, 0, 0, 0], 
     [3, 3, 3, 0], 
     [3, 3, 0, 0], 
     [3, 0, 0, 0]]) 

In [143]: np.where(A==most_occ_num,A,0) 
Out[143]: 
array([[0, 0, 0, 0], 
     [3, 3, 3, 0], 
     [3, 3, 0, 0], 
     [3, 0, 0, 0]]) 
1

純粋なPythonのアプローチ:

counts = [[x.count(i) for i in x] for x in A] 
B = [[n if x.count(n) == max(counts[i]) else 0 for n in x ] for (i, x) in enumerate(A)] 
まず
0

、それを平ら:

その後
flat = A.flatten[0] 
# flat = [1, 0, 0, 2, .. ] 

、リストのモードを見つける:

Finding the mode of a list

をなしモードを置き換える:

B = A.copy() 
B[B != mode] = 0 
関連する問題