У меня есть массив numpy, который может содержать значения inf.
Массив numpy представляет собой одномерный вектор чисел.
Есть ли способ изменить значения inf массива на предыдущее значение массива (которое не является inf)?
Поэтому, если 1000-й индекс массива является inf, он должен заменить его 999-м индексом, который не является inf.
Вот пример того, что я хочу
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")
Я отредактировал вопрос, чтобы сделать его более понятным. Это отвечает на вопрос?
Вы можете сделать так my_arr[1000] = my_arr[999]
Общая версия - это то, что я ищу.
Как насчет добавления примера, который мы можем использовать?
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)
вы можете опубликовать ошибку, пожалуйста. Я надеюсь, что вы импортировали pandas или numpy, в зависимости от того, что вы используете.
для панд: AttributeError: объект DataFrame не имеет атрибута as_matrix.
для numpy: IndexError: индекс кортежа вне диапазона. В строке idx = np.where(~mask,np.arange(mask.shape[1]),0)
Я не знаю, имеет ли это значение, но мой массив имеет длину 1 000 000
попробуйте обновленный скрипт, который я разместил
Что делать, если есть несколько инф в строке? Вам нужно ближайшее предыдущее значение, отличное от inf? Если первый элемент inf, то каким он должен быть?
Да, я хочу ближайшее предыдущее, это не инф. Первый элемент не должен быть инф. Это решение работает нормально, я думаю. Но я заменил isnan на isinf
почему вы не используете самый простой способ?
for i in range (0,len(a)):
if a[i]==inf: a[i]=a[i-1]
Я никогда не работал с инф. может быть, вы используете тип str, поэтому вы должны написать [i] == 'inf'
inf должен быть np.inf. Также есть лучший способ? Мои массивы очень большие.
что вы подразумеваете под предыдущим значением массива, это элементы любого массива?