2017-01-19 9 views
0

異なるサブ配列の長さを持つ多次元配列をpythonでテキストファイルに保存しようとしました。 私のコードは次のとおり異なるサブ配列長のpythonを持つ多次元配列を保存する

import numpy as np 
a = np.arange(10) 
b = np.arange(5)*0.1 
c = np.arange(3)*10 
v = [list(a),list(b),list(c)] 
v = np.array(v) 
v = v.T 
np.savetxt("file.dat",v) 

結果は示しています

TypeError: Mismatch between array dtype ('object') and format specifier ('%.18e') 

Iのサブアレイ(リスト)の長さが同じではないので、それがあると思います。

この問題を解決するのに手伝ってください。

アイザック

+1

問題は 'A'、 'B'、 'C​​'とは、同じ' len'を持っていないので、vは "であるということですこれは、 'np.array(v)'を呼び出すときに、オブジェクトの配列を作成しています。それらのオブジェクトのそれぞれは、Pythonのリストです。 Numpyはギザギザの配列をサポートしていません。基本的には、配列の配列や配列の配列を扱うことができますが、dtypeは 'object'でなければなりません。これは' numpy'の目的をかなり凌駕します。ちょうどPythonのリストを使用してください。 –

+0

juanpa.arrivillagaありがとうございます:私は、同じファイルの列として、b、cを保存したいと思います。それを行う方法をお勧めしますか? v.Tはリストをサポートしていません。 – Isaac

答えて

2

savetxtvを見て、ありがとう:

In [34]: v 
Out[34]: 
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [0.0, 0.10000000000000001, 0.20000000000000001, 0.30000000000000004, 0.40000000000000002], 
     [0, 10, 20]], dtype=object) 

In [36]: v.shape 
Out[36]: (3,) 

それはあなたの3つの配列が含まれている1D、3要素の配列です。 .Tは何もしません。 savetxtは2dテーブルを保存するように設計されています。このようなコンポーネントから配列を作成することを試す必要があるかもしれません。長さが異なるという事実が重要です。あなたはどのような出力を期待していた

In [39]: np.savetxt('test.txt',v,fmt='%s') 
In [40]: cat test.txt 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
[0.0, 0.10000000000000001, 0.20000000000000001, 0.30000000000000004, 0.40000000000000002] 
[0, 10, 20] 

せいぜいsavetxtは、ファイルに3つのリストを書くことができますか?

==============

zip_longestは、 '列' を作成することができます。デフォルトの塗りつぶしはNoneです。私は空の文字列で埋めることができますが、次に%s fmtを使用する必要があります。

In [50]: for v in itertools.zip_longest(a,b,c,fillvalue=''): 
    ...:  print('%5s, %5s. %5s'%tuple(v)) 

    0, 0.0.  0 
    1, 0.1. 10 
    2, 0.2. 20 
    3, 0.3.  
    4, 0.4.  
    5,  .  
    6,  .  
    7,  .  
    8,  .  
    9,  . 

または中間配列を持つ:

In [51]: arr=np.array(list(itertools.zip_longest(a,b,c,fillvalue=''))) 
In [52]: arr 
Out[52]: 
array([['0', '0.0', '0'], 
     ['1', '0.1', '10'], 
     ['2', '0.2', '20'], 
     ['3', '0.3', ''], 
     ['4', '0.4', ''], 
     ['5', '', ''], 
     ['6', '', ''], 
     ['7', '', ''], 
     ['8', '', ''], 
     ['9', '', '']], 
     dtype='<U32') 
In [53]: np.savetxt('test.txt',arr, fmt='%5s',delimiter=',') 
In [54]: cat test.txt 
    0, 0.0, 0 
    1, 0.1, 10 
    2, 0.2, 20 
    3, 0.3,  
    4, 0.4,  
    5,  ,  
    6,  ,  
    7,  ,  
    8,  ,  
    9,  , 
+0

私がv.Tをした理由は、列として3つの配列にあります。ありがとうございます。 – Isaac

+1

'itertools.zip_longest '(PY3)を使って' padded '列を作成する例を追加しました。 – hpaulj

+0

ありがとう、hpaulj。それは本当に役立ちます。 – Isaac

関連する問題