【发布时间】:2015-08-09 22:08:29
【问题描述】:
假设我们有一个 1d numpy 数组,其中填充了一些 int 值。假设其中一些是0。
有没有什么办法,使用numpy 数组的力量,用找到的最后一个非零值填充所有0 值?
例如:
arr = np.array([1, 0, 0, 2, 0, 4, 6, 8, 0, 0, 0, 0, 2])
fill_zeros_with_last(arr)
print arr
[1 1 1 2 2 4 6 8 8 8 8 8 2]
一种方法是使用这个函数:
def fill_zeros_with_last(arr):
last_val = None # I don't really care about the initial value
for i in range(arr.size):
if arr[i]:
last_val = arr[i]
elif last_val is not None:
arr[i] = last_val
但是,这是使用原始 python for 循环,而不是利用 numpy 和 scipy 电源。
如果我们知道可能有相当少量的连续零,我们可以使用基于numpy.roll 的东西。问题是连续零的数量可能很大......
有什么想法吗?还是直接去Cython?
免责声明:
我会说很久以前我在 stackoverflow 中发现了一个问题,询问类似或非常类似的内容。我没能找到它。 :-(
也许我错过了正确的搜索词,抱歉重复了。也许这只是我的想象......
【问题讨论】:
-
如果您不介意使用
pandas,请查看ffill方法(或查看fillna了解完整内容)。但是,numpy 中没有内置“前向填充”类型的功能。 -
正如@JoeKington 提到的,pandas 中的
fillna会这样做。 Cython 源是pad_2d_inplace_函数here,特别是底部的内循环。该代码正是您在示例中编写的代码。 -
@JoeKington 谢谢!不错的功能!我仍然更愿意避免依赖
pandas这个...