【问题标题】:Remapping `numpy.array` with missing values用缺失值重新映射“numpy.array”
【发布时间】:2016-07-30 05:48:13
【问题描述】:

我正在处理一些大型数据集 - 作为时间函数的观察结果 - 这些数据集在时间上是不连续的(即,有很多缺失的数据,没有完整的记录)。为了好玩,有很多数据集,都有缺失的记录,都在随机的地方……

不知何故,我需要及时“同步”数据,将丢失的数据标记为丢失数据,而不是完全不存在。我已经设法让这部分工作,但我仍然遇到一些问题。

例子:

import numpy as np

# The date range (in the format that I'm dealing with), which I define
# myself for the period in which I'm interested
dc = np.arange(2010010100, 2010010106)

# Observation dates (d1) and values (v1)
d1  = np.array([2010010100, 2010010104, 2010010105]) # date
v1  = np.array([10,         11,         12        ]) # values

# Another data set with (partially) other times
d2  = np.array([2010010100, 2010010102, 2010010104]) # date
v2  = np.array([13,         14,         15        ]) # values

# For now set -1 as fill_value
v1_filled = -1 * np.ones_like(dc)
v2_filled = -1 * np.ones_like(dc)

v1_filled[dc.searchsorted(d1)] = v1
v2_filled[dc.searchsorted(d2)] = v2

这给了我想要的结果:

v1_filled = [10 -1 -1 -1 11 12]
v2_filled = [13 -1 14 -1 15 -1]

但前提是d1d2 中的值也在dc 中;如果d1d2 中的值不在dc 中,则代码将失败,因为searchsorted 的行为如下:

如果没有合适的索引,则返回 0 或 N(其中 N 是 a 的长度)。

例如,如果我将 d2v2 更改为:

d2  = np.array([2010010100, 2010010102, 2010010104, 0]) # date
v2  = np.array([13,         14,         15,         9999]) # values

结果是

[9999   -1   14   -1   15   -1]

在这种情况下,因为d2=0 不在dc 中,它应该丢弃该值,而不是在开头(或结尾)插入它。知道如何轻松实现这一目标吗?

【问题讨论】:

  • 这种任务正是 pandas 擅长的。
  • 是的,我很害怕……我和熊猫有点爱恨交加;它似乎非常有用,但我也觉得入门有点困难。

标签: python numpy


【解决方案1】:

如果您在调用dc.searchsorted(d2) 之前执行d2 = np.intersect1d(dc, d2),它将删除 d2 中所有不在 dc 中的元素。

【讨论】:

  • 我最终使用了一种稍微不同的方法(首先压缩掩码数组以删除掩码值,因为并非所有统计例程都适用于掩码数组),但intersect1d() 确实是缺少的步骤。 ..
猜你喜欢
  • 2020-11-25
  • 1970-01-01
  • 2012-10-16
  • 2020-11-28
  • 2019-04-15
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多