时间序列与不均匀的元素

时间:2012-09-27 23:39:04

标签: python numpy resize time-series

我有一个关于在一个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函数返回一个数组,所以我很困惑为什么设置list的元素等于该数组不起作用。

编辑: 我找到了一个使用常规python列表的简单解决方案:

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

但我仍然很好奇为什么以上不起作用,因为肯定设置一个等于某事的元素是可能的。或者你只能将元素[i]设置为等于[1,x]数组中的某些东西吗?

2 个答案:

答案 0 :(得分:2)

使用element=n.resize(element, (1,2)),您实际上正在创建一个新对象element,该对象是旧np.resizeelement的结果,但是您没有做任何事情使用这个新对象,您的修改就会丢失。

执行element.append(0)时,您正在修改element,因此您仍然指的是初始对象,并且您的修改已保存。

也就是说,有更好的方法来处理ndarray中缺少的元素。正如您所注意到的,如果不是所有这些元素都是两个项目的序列,则无法从(N,2)元素列表中创建N数组:您必须以某种方式填补空白。如果您的初始数据来自文本文件,则可以使用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值。

答案 1 :(得分:0)

当你说element=...你没有修改元素引用的对象时,你正在使element引用一个新对象。当你在元素上调用append时,你实际上正在修改对象。