在Python和numpy中,如何使用前一个元素替换数组中的缺失值? (蒙面数组?)

时间:2013-11-30 18:41:10

标签: python arrays numpy replace

我对Python很陌生,所以提前感谢你对这个noob问题的帮助。

import numpy as np
a=np.arange(30)
a[5]=a[10]=0
print a
array([10, 11, 12, 13, 14,  0, 16, 17, 18, 19,  0, 21, 22, 23, 24])

如何将零更改为前一个值?我知道我可以通过以下方式轻松地将零更改为常量:

a[a==0]=3
array([10, 11, 12, 13, 14,  3, 16, 17, 18, 19,  3, 21, 22, 23, 24])

但我正在寻找能让我回归的东西:

array([10, 11, 12, 13, 14, 14, 16, 17, 18, 19, 19, 21, 22, 23, 24])

我觉得它与蒙面数组有关,但是我找不到任何通过谷歌搜索排序的例子。谢谢。


在回答@ DSM的问题时,第一个值永远不会为零,但可能会有一串连续的零。

所以我希望能够改变:

array([10, 11, 12, 13, 14,  0,  0,  0, 18, 19,  0, 21, 22, 23, 24])

进入

array([10, 11, 12, 13, 14, 14, 14, 14, 18, 19, 19, 21, 22, 23, 24])

2 个答案:

答案 0 :(得分:4)

处理连续性很棘手。怎么样:

def fill_from_left(a, x=0):
    to_fill = (a == x)
    if a[0] == x:
        raise ValueError("cannot have {} as first element".format(x))
    if to_fill.any():
        lefts = ~to_fill & (np.roll(a, -1) == x)
        fill_from = lefts.cumsum()
        fill_with = a[np.where(lefts)[0]][fill_from - 1]
        a[to_fill] = fill_with[to_fill]

给出了

>>> a = np.array([1,2,3,0,4,0,0,5])
>>> fill_from_left(a)
>>> a
array([1, 2, 3, 3, 4, 4, 4, 5])

老实说,但是,大部分时间我都有“缺失值”,因为我正在使用真实数据,在这种情况下,我倾向于使用pandas而不是裸numpy 。与Series相比,ndarray更容易填写:这只是s.replace(0, np.nan).ffill()

答案 1 :(得分:3)

如何使用numpy.roll将数组的所有值向左移一,然后使用numpy.where

>>> a=np.arange(10, 25)
>>> a[5]=a[10]=0
>>> a
array([10, 11, 12, 13, 14,  0, 16, 17, 18, 19,  0, 21, 22, 23, 24])
>>> np.where( a == 0, np.roll( a, 1 ), a )
array([10, 11, 12, 13, 14, 14, 16, 17, 18, 19, 19, 21, 22, 23, 24])