首页 > 解决方案 > 如何将numpy数组中的inf值更改为前一个非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")

标签: pythonarraysnumpyinf

解决方案


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,axis=1, 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,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)

推荐阅读