2017-05-17 6 views
1

np.vstackで大きな行列を作成し、文字列のベクトルを最初の行に、その後に数値の行列を付けてみましょう。ファイルを保存/書き込みするにはどうしたらいいですか?素晴らしい整列の方法で?最初の行に文字列を続けて数字の行列を続けて書きます

の簡素化:

names = np.array(['NAME_1', 'NAME_2', 'NAME_3']) 
floats = np.array([ 0.1234 , 0.5678 , 0.9123 ]) 

# 1) In order to vstack them, do I need to expand dimensions? 

np.expand_dims(floats, axis=0) 
np.expand_dims(names, axis=0) 

Output = np.vstack((names,floats)) # so I get the following matrix 
    NAME_1 NAME_2 NAME_3 
    0.1234 0.5678 0.9123 

# 2) How can a save/print into a file being able to modify the format of the numbers? 
# And keep the columns aligned? 
# Something like this: (taking into account that I have a lot of columns) 
    NAME_1 NAME_2 NAME_3 
    1.23e-1 5.67e-1 9.12e-1 
# I tryied with: 
np.savetxt('test.txt', Matrix, fmt=' %- 1.8s' , delimiter='\t') 

# But I can't change the format of the numbers. 

感謝を事前に!!

+0

配列内に文字列と数字を混在させないでください。最初に 'names'を書いて、適切なフォーマットで' floats'を書いてください。 – kazemakase

+0

最初の行の後にどのように行列を追加するのですか?ありがとう! – amc

+0

'f = open( 'test.txt')'でファイルを開きます。次に、ファイル名の代わりに 'f'を' np.savetxt'に渡します。 'np.savetxt'を' headers'のために一回、 'floats'のために一回二回呼び出します。最後に、 'f.close()'でファイルを閉じます。 – kazemakase

答えて

2

明らかに、私はカゼマカゼのコメントに続く解決策を見つけました。これは大きな行列のために非常に非効率的に感じているが、それは作業を行います:

所望の出力を与える
names = np.array(['NAME_1', 'NAME_2', 'NAME_3']) 
floats = np.array([[ 0.1234 , 0.5678 , 0.9123 ], 
        [ 0.1234 , -0.5678 , 0.9123 ]]) 

with open('test.txt', 'w+') as f: 
    for i in range(names.shape[0]) : 
     f.write('{:^15}'.format(names[i])) 
    f.write('{}'.format('\n')) 

    for i in range(floats.shape[0]) : 
     for j in range(floats.shape[1]) : 
      f.write('{:^ 15.4e}'.format(floats[i,j])) 
     f.write('{}'.format('\n')) 

NAME_1   NAME_2   NAME_3  
    1.2340e-01  5.6780e-01  9.1230e-01 
    1.2340e-01 -5.6780e-01  9.1230e-01 

ありがとうございました!

+0

それは私が心に留めていたものではありませんが、あなたが道を見つけたことを嬉しく思っています。実際には遅すぎることがなければ、効率について心配しないでください。 (ヒント:改行を生成するために 'f.write( '\ n')'を書くことができます。そのために 'format'を使う必要はありません) – kazemakase

0

savetxtは、headerのパラメータをとります。

In [3]: header = ' '.join(names) 
In [4]: header 
Out[4]: 'NAME_1 NAME_2 NAME_3' 
In [5]: np.savetxt('test.txt', floats, fmt='%15.4e', header=header) 
In [6]: cat test.txt 
# NAME_1 NAME_2 NAME_3 
    1.2340e-01  5.6780e-01  9.1230e-01 
    1.2340e-01  -5.6780e-01  9.1230e-01 

これは、フロートを右の列に置きます。ヘッダーの書式を調整する必要があります。

vstackルートに行くと、文字列の配列が得られます。 savetxtと書かれていますが、フォーマットの%15s種類を使用する必要がありますすることができます

In [7]: np.vstack((names, floats)) 
Out[7]: 
array([['NAME_1', 'NAME_2', 'NAME_3'], 
     ['0.1234', '0.5678', '0.9123'], 
     ['0.1234', '-0.5678', '0.9123']], 
     dtype='<U32') 

効率については、savetxtは答えと同じように機能しますが、一度に1行全体をフォーマットして書き込む点が異なります。 savetxtコールは効果的です:

fmt = ''.join(['%15.4e']*3)+'\n' 
f = open(file, 'wb') 
f.write(header); f.write('\nl') 
for row in floats: 
    f.write(fmt % tuple(row)) 

In [9]: fmt=''.join(['%15.4e']*3) 
In [10]: print(fmt%tuple(floats[0])) 
    1.2340e-01  5.6780e-01  9.1230e-01 
+0

ありがとうhpaulj!これはsavetxtを使用するときに見たものです。%15種類のフォーマットでしか使用できないので、vstackを使用する前に数値をフォーマットするか、vstackを使用せずにf.writeを使用して要素ごとに書き込みを行うかのようです。 – amc

関連する問題