python - 元素大小不均匀的时间序列

标签 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))

它在循环范围内工作,但如果我打印列表,所有元素都相同,就像循环从未发生过一样。调整大小函数返回一个数组,因此我很困惑为什么将列表元素设置为等于该数组不起作用。

编辑: 我找到了一个使用常规 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/

相关文章:

python - 将 Dagster 与 Django 集成

python - 如何在 Python 对象上搜索/查找方法或属性? (搜索所有后代)

python - 如何使 scrapy 输出信息在 debian 中显示与在 Windows 中相同的 cjk 外观?

python - 提高掩蔽性能,然后加权平均

resize - 如何在不影响应用程序的情况下调整 qcow2 图像的大小

python - 强制 QRubberBand 具有特定的纵横比

python - 循环中的 Matplotlib 传奇?

python - pytorch 运行时错误 : Expected object of scalar type Double but got scalar type Float

python - 在 Pandas 数据框中矢量化条件赋值

iphone - 当我将状态栏设置为隐藏或不隐藏时如何自动调整 ios View 的大小