Как изменить значения inf в массиве numpy для предыдущего значения, отличного от inf?

У меня есть массив 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")

что вы подразумеваете под предыдущим значением массива, это элементы любого массива?

rainu 23.12.2020 19:28

Я отредактировал вопрос, чтобы сделать его более понятным. Это отвечает на вопрос?

Daniel Casasampera 23.12.2020 19:51

Вы можете сделать так my_arr[1000] = my_arr[999]

tibi 23.12.2020 19:57

Общая версия - это то, что я ищу.

Daniel Casasampera 23.12.2020 19:58

Как насчет добавления примера, который мы можем использовать?

tdelaney 23.12.2020 20:05
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
802
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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, в зависимости от того, что вы используете.

Rajnish kumar 23.12.2020 19:51

для панд: AttributeError: объект DataFrame не имеет атрибута as_matrix.

Daniel Casasampera 23.12.2020 19:55

для numpy: IndexError: индекс кортежа вне диапазона. В строке idx = np.where(~mask,np.arange(mask.shape[1]),0)

Daniel Casasampera 23.12.2020 19:56

Я не знаю, имеет ли это значение, но мой массив имеет длину 1 000 000

Daniel Casasampera 23.12.2020 20:00

попробуйте обновленный скрипт, который я разместил

Rajnish kumar 23.12.2020 20:16

Что делать, если есть несколько инф в строке? Вам нужно ближайшее предыдущее значение, отличное от inf? Если первый элемент inf, то каким он должен быть?

tdelaney 23.12.2020 20:37

Да, я хочу ближайшее предыдущее, это не инф. Первый элемент не должен быть инф. Это решение работает нормально, я думаю. Но я заменил isnan на isinf

Daniel Casasampera 23.12.2020 21:19
Ответ принят как подходящий

почему вы не используете самый простой способ?

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

Я никогда не работал с инф. может быть, вы используете тип str, поэтому вы должны написать [i] == 'inf'

inf должен быть np.inf. Также есть лучший способ? Мои массивы очень большие.

Daniel Casasampera 23.12.2020 20:56

Другие вопросы по теме