2011-11-11 116 views
0

我想將轉換應用於記錄數組的某些列並重新分配這些值。什麼是規範的方式來做到這一點?重新分配多個記錄到記錄數組?

List = [['a',.3,.3], 
     ['b',-.5,.4]] 

Arr = np.rec.fromrecords(List,names=['id','var1','var2']) 

我想對某些變量應用一些縮放。我會讓這是一個例子,但總的來說,縮放可能比減法更復雜。

scale = lambda x: x - x.mean(0) 

這不起作用

Arr[['var1','var2']].mean(0) 
TypeError: cannot perform reduce with flexible type 

所以,我必須轉換爲非結構化陣列,但後來如何重新分配回記錄陣列?我循環?

Unstr = Arr[['var1','var2']].view('float').reshape(len(Arr),-1) 

Arr[['var1','var2']] = scale(Unstr) 

IndexError: unsupported iterator index 
+1

pythonista的好綽號:-) – 6502

+0

謝謝!是的,刺拳是針對Python ...;) – hatmatrix

回答

1

爲什麼不逐一縮放變量?

In [13]: %paste 
import numpy as np 

List = [['a',.3,.3], 
     ['b',-.5,.4]] 

scale = lambda x: x - x.mean() 
Arr = np.rec.fromrecords(List,names=['id','var1','var2']) 

vars_to_scale = ['var1', 'var2'] 
for var in vars_to_scale: 
    Arr[var] = scale(Arr[var]) 
print Arr 
## -- End pasted text -- 
[('a', 0.4, -0.04999999999999999) ('b', -0.4, 0.050000000000000044)] 
+0

對,這就是它是如何做...帶有循環?這是顯而易見的方法,但我認爲'numpy'會足夠高以允許我避免這樣的構造(否則它不會在'fortran' /'C'之上提供太多價值?)。 – hatmatrix

+0

好吧,使用'numpy.ndarray'可以提供足夠的高層次來擊敗'Fortran'和'C'。但是,AFAIK,'numpy.recarray'是一個由_several_數組組成的結構。您可以將多個數組視爲一個數組,但不能同時處理多個數組,但尤其是不能爲一個數組指定一個數組序列。另外,Python的禪教導說,顯式比隱式更好,什麼可以比循環更明確? :) –

+0

來自R我討厭循環,但知道一個recarray包含幾個ndarrays幫助我接受循環在這種情況下是不可避免的。 – hatmatrix