我目前正在使用np.loadtxt
将一些混合数据加载到结构化的numpy数组中。我对一些列进行了一些计算,以便稍后输出。出于兼容性原因,我需要维护一个特定的输出格式,因此我想在特定点插入这些列,并使用np.savetxt
一次性导出数组。
一个简单的设置:
import numpy as np
x = np.zeros((2,),dtype=('i4,f4,a10'))
x[:] = [(1,2.,'Hello'),(2,3.,'World')]
newcol = ['abc','def']
对于这个例子,我想把newcol
作为第二列。我是Python的新手(来自MATLAB)。从我的搜索到目前为止我能找到的方法是append newcol
to the end of x
将其作为最后一列,或x
到newcol
以使其成为第一列。我也出现了np.insert
,但它似乎不适用于结构化数组,因为它在技术上是一维数组(根据我的理解)。
实现这一目标的最有效方法是什么?
EDIT1:
我进一步研究了np.savetxt
,似乎它不能用于结构化数组,所以我假设我需要循环并用f.write
写每一行。我可以使用该方法明确指定每个列(按字段名称),而不必担心结构化数组中的顺序,但这似乎不是一个非常通用的解决方案。
对于上面的例子,我想要的输出是:
1, abc, 2.0, Hello
2, def, 3.0, World
答案 0 :(得分:2)
这是一种在所需位置向阵列添加字段的方法:
from numpy import zeros, empty
def insert_dtype(x, position, new_dtype, new_column):
if x.dtype.fields is None:
raise ValueError, "`x' must be a structured numpy array"
new_desc = x.dtype.descr
new_desc.insert(position, new_dtype)
y = empty(x.shape, dtype=new_desc)
for name in x.dtype.names:
y[name] = x[name]
y[new_dtype[0]] = new_column
return y
x = zeros((2,), dtype='i4,f4,a10')
x[:] = [(1, 2., 'Hello'), (2, 3., 'World')]
new_dt = ('my_alphabet', '|S3')
new_col = ['abc', 'def']
x = insert_dtype(x, 1, new_dt, new_col)
现在x
看起来像
array([(1, 'abc', 2.0, 'Hello'), (2, 'def', 3.0, 'World')],
dtype=[('f0', '<i4'), ('my_alphabet', 'S3'), ('f1', '<f4'), ('f2', 'S10')])
该解决方案改编自here。
要将recarray打印到文件,您可以使用类似:
from matplotlib.mlab import rec2csv
rec2csv(x,'foo.txt')