Python 具有不均匀大小元素的时间序列

Python 具有不均匀大小元素的时间序列,python,numpy,resize,time-series,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(ele

我有一个关于在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]数组中的某个值吗?

当您说
element=…
时,您不是在修改元素引用的对象,而是在使
element
引用一个新对象。当你在元素上调用
append
时,你实际上是在修改对象。

使用
element=n.resize(element,(1,2))
,你实际上是在创建一个新的对象
element
,这是对旧
元素
np.resize
的结果,但是你没有对这个新对象做任何事情,你的修改丢失了

当您执行
element.append(0)
时,您正在原地修改
element
,因此您仍然引用初始对象,并且您的修改将被保存

也就是说,有更好的方法来处理
ndarray
中缺少的元素。正如您所注意到的,如果不是所有元素都是由两个项组成的序列,则无法从
N
元素列表中创建
(N,2)
数组:您必须以某种方式填补空白。如果初始数据来自文本文件,则可以使用
usemack=True
参数创建:


最初的空白已经用特殊的
np.ma.masked
值为您填补了。

对于处理时间序列,我建议。该函数应该提供解析数据所需的一切。
>>> 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)