假设我有三个向量a
、b
和c
:
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_stack
、a
和b
在创建时没有声明显式数据类型,如上图所示。 最佳答案
有一个鲜为人知的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