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')

如果您经常使用零维度的 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'没有使用'a',这样我就可以在我的测试用例中覆盖每个文件。

于 2013-04-08T14:53:40.823 回答