Выберите первые вхождения после NaNs в массиве Numpy на основе условия

#python #arrays #numpy

#python #массивы #numpy

Вопрос:

Я совсем новичок в Python и Numpy. Может кто-нибудь помочь мне понять, как я могу решить проблему, которую здесь раскрывают? У меня есть следующий 2D-массив (arr) с NANS и числами, здесь ниже:

 arr = np.array([[np.nan, 2.3, np.nan, np.nan, np.nan, 6.4, np.nan],
             [np.nan, np.nan, 3.1, 3.4, np.nan, np.nan, 3.9]])
 

Мне нужно получить новый массив (результат) с первыми вхождениями no-NaN второй строки в arr, дополненными первыми вхождениями no-NaN первой строки в arr; остальные все NAN. Ниже приведен результат:

 result = np.array([np.nan, np.nan, 3.1, np.nan, np.nan, np.nan, 3.9])
 

Заранее большое спасибо.

Комментарии:

1. Извините, ваш вопрос неясен. Что вы подразумеваете под условным?

Ответ №1:

Каждое первое вхождение числа во втором массиве после появления num в первом массиве-

 import numpy as np

#arr = np.array([[np.nan, 2.3, np.nan, np.nan, np.nan, 6.4, np.nan],
#                [np.nan, np.nan, 3.1, 3.4, np.nan, np.nan, 3.9]])

arr = np.array([[np.nan, 2.3, np.nan, np.nan, np.nan, 6.4, np.nan],
                [3, np.nan, np.nan, 3.1, 3.4, np.nan, np.nan]])

result = np.full_like(arr[1, :], np.nan)

arr1pos = np.squeeze(np.argwhere(np.isfinite(arr[0, :])))
arr2pos = np.squeeze(np.argwhere(np.isfinite(arr[1, :])))

first_occurrence_idxs = np.searchsorted(arr2pos, arr1pos)
if first_occurrence_idxs[-1] == arr2pos.size:
    result[arr2pos[first_occurrence_idxs[:-1]]] = arr[1, :][arr2pos[first_occurrence_idxs[:-1]]]
else:
    result[arr2pos[first_occurrence_idxs]] = arr[1, :][arr2pos[first_occurrence_idxs]]
print(result)
 
 [nan nan nan 3.1 nan nan nan]
 

Комментарии:

1. Спасибо за быстрое воспроизведение. Код работает только в случае отсутствия смежных значений NaNs, но не в том случае, если в середине есть другие значения: вот ниже пример, где это не работает: arr = np.array([[np.nan, 2.3, np.nan, np.nan, np.nan, 6.4,np.nan], [3, np.nan, np.nan, 3.1, 3.4, np.nan, np.nan]])

2. Извините, теперь даже я в замешательстве. Не могли бы вы лучше объяснить свою проблему и обновить вопрос? Я был бы рад помочь

3. Мне нужны первые вхождения числа в моем 2-м массиве на основе вхождений числа в первом массиве. В частности, при первом вхождении первого номера массива в 1-м массиве происходит первое вхождение первого номера во 2-м массиве. Повторите шаг до конца массивов. Принять во внимание, что оба массива являются числами и np.nans случайным образом. Большое спасибо за поддержку.

4. Похоже, вы хотите, чтобы числа во 2-м массиве были выровнены с числом вхождений в первом массиве, я прав?

5. Отличная работа! Это работает правильно. Большое спасибо