2012-09-27 42 views
2

我有一個關於在一個numpy數組中取一個元素並在一個循環中調整其大小的問題。帶有不均勻尺寸元素的時間序列

基本問題是,我有一個格式爲(x,y)的時間序列,其中一些元素缺少y值,因此它們被讀入程序中的長度爲1。

即: [X,Y] [X,Y] [X] [X,Y]

所以我需要採取這些偶然點,並將它們的大小調整爲標準(1,2 )(然後根據分佈生成一個點,但這不是麻煩)。我知道numpy.resize功能的,但是當我嘗試:

for element in list: 
    if len(element)==1: 
     element=n.resize(element,(1,2)) 

它的工作循環的範圍之內,但如果我打印列表中的所有元素都彷彿從未發生過的循環一樣。 resize函數返回一個數組,所以我很困惑,爲什麼設置列表的元素等於該數組不起作用。

編輯: 我發現使用常規的Python列表一個簡單的解決方案:

for element in list: 
    if len(element)==1: 
     element.append(0) 

但我仍然好奇,爲什麼上面是不行的,因爲肯定是設置元素等於事情是可能的。或者你只能將元素[i]設置爲等於[1,x]數組中的某個元素?

+0

用於處理時間序列,我會建議[pandas](http://pandas.pydata.org/)。 [read_csv](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html#pandas-io-parsers-read-csv)函數應該提供您需要的所有內容解析你的數據。 – bmu

回答

0

當你說element=...你沒有修改元素引用的對象時,你正在使element引用一個新的對象。當您在元素上調用append時,您實際上正在修改該對象。

2

隨着element=n.resize(element, (1,2)),你實際上是創建一個新對象element那就是np.resize對舊element的結果,但你不與這個新的對象做任何事情,你的修改會丟失。

當你做element.append(0)時,你正在修改element,所以你仍然指的是初始對象,並且你的修改被保存。

也就是說,有更好的方法來處理ndarray中缺失的元素。正如你已經注意到的,如果不是所有這些元素都是兩個項目的序列,你不能在N元素列表中創建(N,2)陣列:你必須以某種方式填補空白。如果您的初始數據從一個文本文件來了,你可以使用np.genfromtxtusemask=True參數創建一個MaskedArray

>>> data = StringIO.StringIO("1,2\n3,4\n,6\n7,\n") 
>>> x = np.genfromtxt(data, delimiter=",", usemask=True) 
>>> x 
masked_array(data = 
[[1.0 2.0] 
[3.0 4.0] 
[-- 6.0] 
[7.0 --]], 
      mask = 
[[False False] 
[False False] 
[ True False] 
[False True]], 
     fill_value = 1e+20) 

初始間隙中充滿了對你的特殊np.ma.masked值。