如何为之前的非 inf 值更改 numpy 数组中的 inf 值?

问题描述

我有一个可能包含 inf 值的 numpy 数组。

numpy 数组是一维数字向量。

有没有办法将数组的 inf 值更改为数组的前一个值(不是 inf)?

因此,如果数组的第 1000 个索引是 inf,则应将其替换为不是 inf 的第 999 个索引。

这是我想要的示例

vals = np.random.random(10000)
vals[vals<0.1] = np.inf

indexes = np.asarray(vals==np.inf).nonzero()

for i in indexes:
    vals[i] = vals[i-1]

if np.isinf(vals).any():
    print("It doesnt work")
else:
    print("It works")

解决方法

def pandas_fill(arr):
    df = pd.DataFrame(arr)
    df.fillna(method='ffill',axis=1,inplace=True)
    out = df.as_matrix()
    return out

def numpy_fill(arr):
    mask = np.isnan(arr)
    idx = np.where(~mask,np.arange(mask.shape[1]),0)
    np.maximum.accumulate(idx,out=idx)
    out = arr[np.arange(idx.shape[0])[:,None],idx]
    return out

inf-inf 将作为 nan 加载。所以,应该这样处理。

试试这个更新的。

import numpy as np

Data = np.array([np.nan,1.3,np.nan,1.4,np.nan])

nansIndx = np.where(np.isnan(Data))[0]
isanIndx = np.where(~np.isnan(Data))[0]
for nan in nansIndx:
    replacementCandidates = np.where(isanIndx>nan)[0]
    if replacementCandidates.size != 0:
        replacement = Data[isanIndx[replacementCandidates[0]]]
    else:
        replacement = Data[isanIndx[np.where(isanIndx<nan)[0][-1]]]
    Data[nan] = replacement
print(Data)
,

为什么不使用最简单的方法?

for i in range (0,len(a)):
    if a[i]==inf: a[i]=a[i-1]

我从未使用过 inf。也许你的类型是 str ,所以你应该写 a[i]=='inf'