当前位置: 首页 > 面试题库 >

用最后一个非零值填充1d numpy数组的零值

龙亮
2023-03-14
问题内容

假设我们有一个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

但是,这是使用原始的pythonfor循环,而不是利用numpyandscipy功能。

如果我们知道可能有相当数量的连续零,则可以使用基于的东西numpy.roll。问题在于连续零的数量可能很大…

有任何想法吗?还是我们应该直接去Cython

免责声明:

我会说很久以前,我在stackoverflow中发现了一个问题,询问类似或类似的内容。我找不到它。:-(

也许我错过了正确的搜索字词,对不起,重复。也许这只是我的想象…


问题答案:

这是使用的解决方案np.maximum.accumulate

def fill_zeros_with_last(arr):
    prev = np.arange(len(arr))
    prev[arr == 0] = 0
    prev = np.maximum.accumulate(prev)
    return arr[prev]

我们构造一个数组prev,该数组的长度与相同arr,并且prev[i]是的第 i 个条目之前的最后一个非零条目的索引arr。例如,如果:

>>> arr = np.array([1, 0, 0, 2, 0, 4, 6, 8, 0, 0, 0, 0, 2])

然后prev看起来像:

array([ 0,  0,  0,  3,  3,  5,  6,  7,  7,  7,  7,  7, 12])

然后,我们仅对arrwith进行html" target="_blank">索引prev,就可以得到结果。一个测试:

>>> arr = np.array([1, 0, 0, 2, 0, 4, 6, 8, 0, 0, 0, 0, 2])
>>> fill_zeros_with_last(arr)
array([1, 1, 1, 2, 2, 4, 6, 8, 8, 8, 8, 8, 2])

注意 :请仔细了解当数组的第一个条目为零时它将执行的操作:

>>> fill_zeros_with_last(np.array([0,0,1,0,0]))
array([0, 0, 1, 1, 1])


 类似资料:
  • 问题内容: 在数组末尾加零的更Python方式是什么? 在我的实际用例中,实际上我想将数组填充到最接近的1024倍数。例如:1342 => 2048,3000 => 3072 问题答案: 使用mode可以满足您的需要,在这里我们可以传递一个元组作为第二个参数来告诉每个大小要填充多少个零,例如a将在左边填充 2个 零,在右边填充 3个 零: 给出为: 也可以通过将元组的元组作为填充宽度来填充2D n

  • 问题内容: 我有一个包含4列的表格:项目,年份,月份,金额。Amount的某些值是null,当发生这种情况时,我想用以前的非null的Amount值来填充这些值。当只有一个空值时,我可以使用LAG函数轻松地做到这一点,但是当连续有多个空值时,我不确定如何处理它。以下是该表的外观示例,其中添加了要在查询中添加的内容的列: 我有两个想法,我似乎无法投入工作来实现自己想要的东西。首先,我要使用LAG,但

  • 本文向大家介绍在MySQL中用零填充列的值,包括了在MySQL中用零填充列的值的使用技巧和注意事项,需要的朋友参考一下 为此,请使用零填充的概念。它使用零填充字段的显示值,直到字段定义中设置的显示宽度 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出-

  • 问题内容: 在JavaScript中建议零填充值的推荐方法是什么?我想我可以构建一个自定义函数以将零填充到类型转换值上,但是我想知道是否有更直接的方法来做到这一点? 注意: “零填充”是指该词在数据库中的含义(其中数字5的6位零填充表示为“ 000005”)。 问题答案: 正如评论员所指出的那样,该解决方案是“聪明的”,而且通常就像聪明的解决方案一样,它占用大量内存并且相对较慢。如果您担心性能,请

  • 问题内容: 抱歉,如果已经提出此问题,我已经进行了深入搜索,什么也没有。 现在,我知道: 会将我的价格填充到左侧的零,因此价格为25将得出 00025 如果我想将它们向右填充,结果是 25000 怎么办?我该如何 仅 使用 String.format 模式呢? 问题答案: 您可以使用: 我可以只使用格式模式吗? 就像方法一样使用。从这篇文章中,您将看到输出空间是硬编码的,因此必须使用。

  • 抱歉,如果这个问题已经提出,我已经做了深入的搜索,什么都没有。 现在,我知道: 会在左边用0填充我的价格,所以25的价格会导致00025 如果我想把它们垫在右边,结果是25000呢?如何仅使用String.format模式?