我有一个关于在 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))
它在循环范围内工作,但如果我打印列表,所有元素都相同,就像循环从未发生过一样。调整大小函数返回一个数组,因此我很困惑为什么将列表元素设置为等于该数组不起作用。
编辑: 我找到了一个使用常规 python 列表的简单解决方案:
for element in list:
if len(element)==1:
element.append(0)
但是我仍然很好奇为什么上面的方法不起作用,因为当然可以将元素设置为等于某个值。或者只能将 element[i] 设置为等于 [1,x] 数组中的某个值?
最佳答案
使用 element=n.resize(element, (1,2))
,您实际上是在创建一个新对象 element
,它是 的结果np.resize
在旧的 element
上,但由于您没有对这个新对象执行任何操作,因此您的修改会丢失。
当您执行element.append(0)
时,您正在就地修改element
,因此您仍然引用初始对象并且您的修改会被保存.
也就是说,有更好的方法来处理 ndarray 中缺失的元素。正如您所注意到的,如果并非所有这些元素都是两个项目的序列,则无法从 N
元素列表中创建 (N,2)
数组:您有以某种方式填补空白。如果您的初始数据来自文本文件,您可以使用 np.genfromtxt
使用 usemask=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
值为您填补。
关于python - 元素大小不均匀的时间序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12631632/