说我有以下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
有人可以推荐一种方法吗?
答案 0 :(得分: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
答案 1 :(得分: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
这可以通过使用[()]
:
>>> b.ndim
0
>>> b[0]
IndexError: 0-d arrays cannot be indexed
>>> b[()]
(1, 2.0, 'buckle_my_shoe')
如果你经常使用零维度的numpy数组,为了得到复杂的dtype,我可能会建议使用NamedTuple
from collections
。
>>> 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
来保持字符串周围的qutoes
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'
,以便我可以覆盖测试用例中的每个文件。