1

次の numpy 構造化配列があるとします。

>>> a = numpy.array((1, 2.0, 'buckle_my_shoe'),dtype=('i4,f8,a14')) 
array((1, 2.0, 'buckle_my_shoe'), 
  dtype=[('f0', '<i4'), ('f1', '<f8'), ('f2', 'S14')])

テキストファイルの単一のスペースまたはタブ区切りの行に保存したい。配列がすべて同じタイプの場合、使用できますnumpy.savetxt('myfile.dat,myarray,newline=" ")。ただし、これは混合データ型/構造化配列を好まないようです。たとえば、次のようになります。

file('myfile.dat', 'a')
numpy.savetxt('myfile.dat',a,newline=" ")

このエラーが発生します:

IndexError: tuple index out of range

誰でもこれを行う方法を推奨できますか?

4

2 に答える 2

5

編集:何らかの理由で、この回答をそのままにしておくことはできないようです。そのため、csvモジュールを不必要に使用しないよりクリーンなバージョンを次に示します。記録としては、@askewchan の回答の方が優れています。

a = numpy.array([(1, 2.0, 'buckle_my_shoe'),
                 (3,4.0,'lock_the_door')],dtype=('i4,f8,a14'))
with open('test.txt','w') as f:
     f.write(' '.join([str(item) for sublist in a for item in sublist]))
print open('test.txt','r').read()

出力:

1 2.0 buckle_my_shoe 3 4.0 lock_the_door
于 2013-04-08T14:58:31.537 に答える
1

あなたの例のようなゼロ配列がある場合は、これを行うことができます:

b = np.array((1, 2.0, 'buckle_my_shoe'), 
         dtype=[('f0', '<i4'), ('f1', '<f8'), ('f2', 'S14')])

with open('myfile.dat','w') as f:
    for el in b[()]:
        f.write(str(el)+' ') # or `f.write(repr(el)+' ') to keep the quote marks

これは、以下を使用して 0d 配列の要素にアクセスすることで機能します[()]

>>> b.ndim
0

>>> b[0]
IndexError: 0-d arrays cannot be indexed

>>> b[()]
(1, 2.0, 'buckle_my_shoe')

次元が 0 の numpy 配列を定期的に使用している場合、複雑な dtype を使用するためにNamedTuplefromcollectionsを提案するかもしれません。

>>> import collections
>>> A = collections.namedtuple('A', ['id', 'val', 'phrase'])
>>> a = A(1, 2.0, 'buckle_my_shoe')

>>> a
A(id=1, val=2.0, phrase='buckle_my_shoe')
>>> a.id
1
>>> a.val
2.0
>>> a.phrase
'buckle_my_shoe'

with open('myfile.dat','w') as f:
    for el in a:    
        f.write(repr(el)+' ')

配列に複数の要素がある場合:

a = np.array([(1, 2.0, 'buckle_my_shoe'),
              (3, 4.0, 'lock_the_door')],
        dtype=('i4, f8, a14'))

ファイルをどのように見せたいのか正確にはわかりません。スペースで区切られたタプルが必要な場合は、これが最善の方法だと思います。

with open('myfile.dat','w') as f:
    for row in a:
        f.write(repr(row)+' ')

次のようなファイルになります。

(1, 2.0, 'buckle_my_shoe') (3, 4.0, 'lock_the_door')

おそらく、コンマや括弧を使用したくない場合は、次のようにできます。

with open('myfile.dat','w') as f:
    for row in a:
        for el in row:
            f.write(str(el)+' ')

これにより、次のファイルが得られます。

1 2.0 buckle_my_shoe 3 4.0 lock_the_door 

repr文字列の周りに引用符を保持するために使用します

with open('myfile.dat','w') as f:
    for row in a:
        for el in row:
            f.write(repr(el)+' ')

これにより、次のファイルが得られます。

1 2.0 'buckle_my_shoe' 3 4.0 'lock_the_door' 

おまけ: dtype にフィールド名がある場合は、それらも出力できます。

a.dtype.names = "index value phrase".split()
a.dtype
#dtype([('index', '<i4'), ('value', '<f8'), ('phrase', 'S14')])

with open('myfile.dat','w') as f:
    for name in a.dtype.names:
        f.write(name + ' ') # or write(repr(name)) to keep the quote marks
    for row in a:
        for el in row:
            f.write(repr(el)+' ')

これらのファイルをコピーする場合は、テストケースでそれぞれを上書きできるように、'w'notを使用していることに注意してください。'a'

于 2013-04-08T14:53:40.823 に答える