在特定列索引处将字段插入结构化数组中

时间:2014-12-12 15:55:15

标签: python-3.x numpy

我目前正在使用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将其作为最后一列,或xnewcol以使其成为第一列。我也出现了np.insert,但它似乎不适用于结构化数组,因为它在技术上是一维数组(根据我的理解)。

实现这一目标的最有效方法是什么?

EDIT1:

我进一步研究了np.savetxt,似乎它不能用于结构化数组,所以我假设我需要循环并用f.write写每一行。我可以使用该方法明确指定每个列(按字段名称),而不必担心结构化数组中的顺序,但这似乎不是一个非常通用的解决方案。

对于上面的例子,我想要的输出是:

1, abc, 2.0, Hello
2, def, 3.0, World

1 个答案:

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