Python 具有不均匀大小元素的时间序列
我有一个关于在numpy数组中获取元素并在循环中调整其大小的问题 基本问题是,我有一个格式为(x,y)的时间序列,其中一些元素缺少y值,因此它们作为长度为1的元素读入程序 即: [x,y] [x,y] [x] [x,y] 因此,我需要将这些偶发点调整为标准(1,2)(然后根据分布生成一个点,但这不是问题所在)。我知道numpy.resize函数,但尝试时: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
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)