2014-02-27 45 views
3

我有一對numpy數組;這裏有一個簡單的等效例如:如何從列數組做一個numpy recarray

t = np.linspace(0,1,100) 
data = ((t % 0.1) * 50).astype(np.uint16) 

我想這些是在D型f8, i2的numpy的recarray列。這是我似乎可以得到我想要什麼的唯一方式:

X = np.array(zip(t,data),dtype=[('t','f8'),('data','i2')]) 

但它是正確的方式,如果我的數據值都很大?我想盡量減少不必要的數據轉移開銷。

這看起來應該是一個簡單的問題,但我找不到一個好例子。

回答

6

這wrorks

rec = np.rec.fromarrays((t, data), dtype=[('t','f8'),('data','i2')]) 

,如果你不喜歡,你總是可以走這條路

arr = np.hstack((t[:, None], data[:, None])).astype(np.dtype([('t', 'f8'), ('data', 'i2')])) 

編輯:

爲了更加徹底的緣故,我加另一種方法有一些時間。

def method_1(t, data): 
    return np.rec.fromarrays((t, data), dtype=[('t','f8'),('data','i2')]) 

def method_2(t, data): 
    return np.r_[t, data].reshape((-1, 2)).astype(np.dtype([('t', 'f8'), ('data', 'i2')])) 

def method_3(t, data): 
    return np.hstack((t[:,None], data[:, None])).astype(np.dtype([('t', 'f8'), ('data', 'i2')])) 

def method_4(t, data): 
    return np.array(zip(t,data),dtype=[('t','f8'),('data','i2')]) 

%timeit method_1(t, data) 
10000 loops, best of 3: 20.8 us per loop 

%timeit method_2(t, data) 
10000 loops, best of 3: 28.9 us per loop 

%timeit method_3(t, data) 
100000 loops, best of 3: 16.6 us per loop 

%timeit method_4(t, data) 
10000 loops, best of 3: 56.9 us per loop