2016-08-15 179 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是一個字典如此無序,所以你可能無法得到的順序列,你通過他們。