从索引中获取相应的值

  • 本文关键字:获取 索引 python numpy
  • 更新时间 :
  • 英文 :


我有一个目标列[Value_0,…Value_n]和一个索引列[idx_0,…idx_k]我想得到相应的列[Value_{idx_0},…Value_{idx_k}]但是我有这三个困难。

  1. 索引列的类型为float
  2. 索引列可以具有NaN值
  3. 如果索引列具有NaN值,我希望Output列在同一位置返回一个NaN值

我如何才能有效地做到这一点(以一种numpy的方式,而不是循环(?

我怀疑写这样的代码Value[Idx[~np.isnan(Idx)].astype(int)]不允许我有第三个条件。

由于python无法将NaN转换为int,因此仅写入Value[Idx.astype(int)]会出现问题。由于Idx的类型为float,因此仅编写Value[Idx]将不起作用。。。

我绝对不在熊猫(公司选择…(上工作,把一件事变成熊猫类型可能会花我很多时间。(超自定义实现…(因此,只使用numpy,并且没有循环(大量数据,循环将花费太多时间(

TLDR单行版本:根据您的描述,给定一个值数组v和一个索引数组i,您的结果是np.where(np.isnan(i), np.nan, v[np.where(np.isnan(i), 0, i.astype(int))])

让我们一步一步看一个简单的例子:

#values
v = np.array([0, 10, 20])
#indices, including NaN
i = np.array([2., np.nan, 1.])

预期输出为[20, NaN, 10]。就像你说的,我们不能用float进行索引,所以让我们制作一个整数索引数组i1:

i1 = i.astype(int) # [2, -9223372036854775808, 1]

NaN被变成了一个巨大的负整数,它不是我们微小数组的有效索引。因此,尝试提前索引v[i1]将引发IndexError

所以,让我们修复这些整数来消除IndexError。0总是一个有效的索引,所以让我们制作一个i2,它等于i1,除了i具有NaN:

i2 = np.where(np.isnan(i), 0, i1) # [2, 0, 1]

现在,让我们尝试索引并将其存储为r0:

r0 = v[i2] # [20,  0, 10]

如此接近,但它没有NaN,而i有NaN。让我们像前面的指数一样替换这个值:

result = np.where(np.isnan(i), np.nan, r0) # [20., nan, 10.]

NaN是一个float值,因此我们的原始整数v值也被强制为float。对此您无能为力,NumPy数组只能容纳一个数字类型。

最新更新