假设我有三个向量abc

a = np.array([1,2,3])
b = np.array([1.2, 3.2, 4.5])
c = np.array([True, True, False])

将其转换为不同数据类型和列标签的矩阵的最简单方法是什么
d = ([[1, 1.2, True],
     [2, 3.2, True],
     [3, 4.5, False]],
     dtype=[('aVals','i8'), ('bVals','f4'), ('cVals','bool')])

这样我就可以将这个矩阵保存到一个d文件中,并在打开它之后访问数据;
>>> d = np.load('dFile')
>>> d['aVals']
np.array([1,2,3], dtype = [('aVals', '<i8)])

我使用cimple.npy来创建矩阵,但是我在尝试如何包含数据类型和列名时感到头疼,因为column_stack不接受column_stack参数,而且在dtype执行之后,我看不到添加字段名称和数据类型的方法。值得一提的是,向量column_stackab在创建时没有声明显式数据类型,如上图所示。

最佳答案

有一个鲜为人知的recarray函数构造这样的数组。在最近的一个问题中提到:
Assigning field names to numpy array in Python 2.7.3
允许它从输入数组推断出所有内容:

In [19]: np.rec.fromarrays([a,b,c])
Out[19]:
rec.array([(1, 1.2, True), (2, 3.2, True), (3, 4.5, False)],
          dtype=[('f0', '<i4'), ('f1', '<f8'), ('f2', '?')])

指定名称
In [26]: d=np.rec.fromarrays([a,b,c],names=['avals','bvals','cVals'])
In [27]: d
Out[27]:
rec.array([(1, 1.2, True),
           (2, 3.2, True),
           (3, 4.5, False)],
          dtype=[('avals', '<i4'), ('bvals', '<f8'), ('cVals', '?')])
In [28]: d['cVals']
Out[28]: array([ True,  True, False], dtype=bool)

创建正确大小和数据类型的目标数组后,它将逐个字段进行复制。这是典型的rec.recfunctions(即使astype这样做)。
# populate the record array (makes a copy)
for i in range(len(arrayList)):
    _array[_names[i]] = arrayList[i]

2011年参考:How to make a Structured Array from multiple simple array

09-26 17:30
查看更多