2016-08-15 37 views
2

可以说我有三个矢量ab,并c如何创建具有不同列数据类型的numpy矩阵?

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

是什么把它变成不同的数据类型和列标签的矩阵d最简单的方法,因为这样的:

d = ([[1, 1.2, True], 
    [2, 3.2, True], 
    [3, 4.5, False]], 
    dtype=[('aVals','i8'), ('bVals','f4'), ('cVals','bool')]) 

这样我就可以将这个矩阵保存到.npy文件中,并在打开它后访问数据;

>>> d = np.load('dFile') 
>>> d['aVals'] 
np.array([1,2,3], dtype = [('aVals', '<i8)]) 

我使用了一个cimple column_stack创建矩阵,但我得到一个头痛试图找出如何包含数据类型和列名,因为column_stack不接受dtype的说法,我可以”在执行column_stack之后,请参阅添加字段名称和数据类型的方法。值得一提的是,向量a,bc在创建时没有声明明确的数据类型,它们如上所示。

+0

顺便说一句,如果你这样做是为了拯救数组,你可以使用'np.savez(OUTFILE,aVals = A,bVals = B,cVals = c)'将所有三个数组保存到压缩的npz文件中。 – unutbu

回答

3

有一个知道recarray函数构造这样的数组。它被引用在最近的SO问题:

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) 

创建的目标阵列之后正确的大小和dtype它通过字段副本进行字段。这是典型的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

+0

添加到hpaulj评论有另一种简单的方法....从numpy.lib._iotools导入easy_dtype为easy ... easy((int,float,float),names =“a,b,c”).. ([''',' 2016-08-16 02:01:09

+0

'easy_dtype'被'genfromtxt'用来将'dtype'参数转换成更正式的'dtype'。 'fromarrays'使用'np.rec.format_parser'来做这个翻译。 – hpaulj

+0

谢谢,这是完美的,非常简单 – Anonymous

3
d = np.empty(len(a), dtype=[('aVals',a.dtype), ('bVals',b.dtype), ('cVals',c.dtype)]) 
d['aVals'] = a 
d['bVals'] = b 
d['cVals'] = c 

作为一种可重复使用的功能:

def column_stack_overflow(**kwargs): 
    dtype = [(name, val.dtype) for name, val in kwargs.items()] 
    arr = np.empty(len(kwargs.values()[0]), dtype=dtype) 
    for name, val in kwargs.items(): 
     arr[name] = val 
    return arr 

然后:

column_stack_overflow(aVals=a, bVals=b, cVals=c) 

不过需要注意的kwargs是一个字典如此无序,所以你可能无法得到的顺序列,你通过他们。