2016-08-04 23 views
1

Python/NumPyを学ぶ方法として、私は20年前のPython 2.7.11でSAS IMLの論文をプログラミングしています。この方法は、外側ループ内に複数のループを有するモンテカルロシミュレーションを含む。私は単純な例で成功しました。私は、各繰り返しから統計を累積する必要がある時点にいるので、リスト、配列、および行列をいつ、どのように、いつ、どのように使用するかについて混同しています。何度も文書や例を探しているにもかかわらず。リスト、配列、行列を追加する

私はレポートを印刷した場合、私はテーブルはこのように見て欲しい(区切り文字はスペースすることができます)

MSEa  Ca MSEb  Cb 
1421 7 1184  3 
925  2 1077 4 

ので、私は、各MSEの列の中で最も小さいMSEとCのペアリングを選択することができます。私は何

MSEV 
[matrix([[ 1421]]), 7, matrix([[ 1184]]), 3, matrix([[ 925]]), 2, matrix([[ 1077]]), 4] 
type(MSEPCV) 
<type 'list'> 

MSEは、 MSEVはMSEV = [] {タイプ(MSEPCV)}、 MSEVはMSE {タイプから作成されるように開始される行列の数学からスカラーである(MSE) }とCOUNT {タイプ(カウント)}

私はすべてをリストにしてtolist()しようとしたが、squacketsは残っていると思った。

+0

リストには大括弧 '[]'が付いています。これはリストの内容です。私はあなたが行列が必要であることを完全には確信していませんが、私はあなたの問題空間に慣れていません –

+0

おそらくミックス配列と行列は異なるセマンティクスを持っているので使いません。 – karakfa

答えて

1

何らかの形で、単一要素行列と普通の数値が混在したリストが完成しました。 Pythonはリスト

[1421, 7, 1184, 3, 925, 2, 1077, 4] 

に表示されることを標準的な方法で

def extract_number(x): 
    try: 
     return x.item(0) # returns first item in x, if x is a matrix 
    except AttributeError: 
     return x   # if x is not a matrix or array, just return x 

print([extract_number(x) for x in MSEV]) 

この意志出力リスト:あなたはこれを避けることができない場合は、常に次のようなものを使用して印刷するためのリストをクリーンアップすることができ私は少し(またはてる

print("""MSEa  Ca MSEb  Cb 
{:4}{:6}{:6}{:7} 
{:4}{:6}{:6}{:7}""".format(*msev)) 
0

:あなたは、フォーマット文字列に見て、このような何かを行うことができ、よりきれいに表示ロット)どのようにあなたはそれがnumpy、私はあなたがnumpy.arraynumpy.matrixを意味すると仮定するつもりですタグ付けされたので、他の

に1を変換するリスト、配列、および行列とを使用する方法と時期について混乱。一言で言えば、使用するとき

  • マトリックス:基本的に決して決して。 np.matrixは無限の混乱の源です。行列の乗算にはdotを使用し、Python 3.5+のみを使用できる場合は@演算子を使用してください。

  • アレイ:寸法とサイズ(numpy用語ではshape)を知っているときに使用します。

  • lists:要素を追加/削除する必要がある場合はリストを使用します。物事を変換する方法については

:リスト、lstnp.asarray(lst)与えられたがnumpyの配列です。与えられた配列、arrarr.tolist()はリストです。行列が与えられた場合、np.asarrayはそれを配列に変換し、行列が1行1列ならばm[0, 0]はスカラです。

0

あなたのmatrixがどこに由来しているのかわからず、なぜマトリックスと数字が混在しているのかわかりませんが、私はそれを処理しようとします。

コピーアンドペーストを容易にするため、matrixを定義します(numpyをnpとしてロードしました)。私はIpythonセッションで働いている:

In [373]: matrix=np.matrix 

In [375]: alist=[matrix([[ 1421]]), 7, matrix([[ 1184]]), 3, matrix([[ 925]]), 2, matrix([[ 1077]]), 4] 

In [376]: alist 
Out[376]: 
[matrix([[1421]]), 
7, 
matrix([[1184]]), 
3, 
matrix([[925]]), 
2, 
matrix([[1077]]), 
4] 

私は行列から要素を抽出ifelse式でリストの内包を通してそれを実行します。スチュアートがしたように私はまた、単純なヘルパー関数を定義することも可能です。

In [379]: newlist=[x[0,0] if isinstance(x,np.matrix) else x for x in alist] 
In [380]: newlist 
Out[380]: [1421, 7, 1184, 3, 925, 2, 1077, 4] 

は現在、配列にそれを回す - それ2行にするためにリシェイプを使用しています。

In [381]: Marray=np.array(newlist).reshape(2,-1) 
In [382]: Marray 
Out[382]: 
array([[1421, 7, 1184, 3], 
     [ 925, 2, 1077, 4]]) 

np.savetxtcsvスタイルファイル書き込みにnumpy機能です:

In [386]: np.savetxt('test.txt',Marray) 
In [387]: cat test.txt 
1.421000000000000000e+03 7.000000000000000000e+00 1.184000000000000000e+03 3.000000000000000000e+00 
9.250000000000000000e+02 2.000000000000000000e+00 1.077000000000000000e+03 4.000000000000000000e+00 

おっとを、デフォルトのフォーマットは、フロートです。整数にそれを変更:

In [388]: np.savetxt('test.txt',Marray, '%d') 

と(ちょうどLinuxのシェルでcatをしているような)結果のファイルを見て

In [389]: cat test.txt 
1421 7 1184 3 
925 2 1077 4 

とヘッダ行を持つ:

In [392]: np.savetxt('test.txt',Marray, '%d',header='MSEa Ca MSEb Cb') 

In [393]: cat test.txt 
# MSEa Ca MSEb Cb 
1421 7 1184 3 
925 2 1077 4 

フォーマットすることができます洗練されているが、それはアイデアを与える。

関連する問題