2

我确定有一个功能,但我找不到它。

我正在做如下计算:

# L = large iterator of lots of numpy arrays
def replace_error_nan(data):
    data[data == ERROR_VALUE] = np.nan
    return data
L = (replace_error_nan(l) for l in L)

我想执行所有由 replace_error_nan 完成的操作,而不需要使用该函数。我敢肯定这是非常简单的事情。

谢谢!


留下“小”评论的人已经回答了问题。我对自己做了一个回答。谢谢!

4

4 回答 4

2

没有错:

for l in L:
  l[l == ERROR_VALUE] = np.nan

如果你坚持单衬它,你可以__setitem__在理解中使用。但是不要。

于 2013-03-14T05:16:18.993 回答
2

您可以使用numpy.place()

L = (np.place(l, l==ERROR_VALUE, np.nan) or l for l in L)
于 2013-03-14T11:42:29.850 回答
2

回答

L = (where(l!=ERROR_VALUE, l, np.nan) for l in L)
于 2013-03-14T05:23:47.803 回答
1

如果您尝试进行迭代器操作,那么@wim 的方法不好,因为这意味着您的迭代器不再是惰性的,我认为您的方法是完全合理的。定义小函数并不是最糟糕的事情。

也就是说,我认为这些替代方案应该可以工作,尽管我在平板电脑上并且没有测试过它们:

L = (l for l in L if not l.__setitem__(l == ERROR_VALUE, np.nan))

L = (l.__setitem__(l == ERROR_VALUE, np.nan) or l for l in L)

它们很可爱(依赖于__setitem__返回None),但我仍然可能会在实际代码中采用您原来的方法。


更新,因为您与np.where我的同时发布了一个解决方案:这可能是最好的解决方案,尽管它确实复制了这些解决方案没有的副本。离开这个是因为我有点喜欢可爱,不过。

于 2013-03-14T05:24:35.600 回答