我对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])
答案 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])