У меня есть следующий массив:
data=array([['beef', 'bread', 'cane_molasses', nan, nan, nan],
['brassica', 'butter', 'cardamom']])
Как удалить нан, чтобы получить:
array([['beef', 'bread', 'cane_molasses'],
['brassica', 'butter', 'cardamom']])
Я пробовал метод, указанный в здесь, но это не работает, поскольку в моем случае мой массив имеет более высокую размерность и не является простым вектором.






Массивы object dtype не поддерживают векторизованные операции. Но вы можете выполнить обратное преобразование сначала в list, а затем обратно в массив. Здесь мы используем факт np.nan != np.nan по дизайну:
data = np.array([['beef', 'bread', 'cane_molasses', np.nan, np.nan, np.nan],
['brassica', 'butter', 'cardamom']])
res = np.array([[i for i in row if i == i] for row in data.tolist()])
array([['beef', 'bread', 'cane_molasses'],
['brassica', 'butter', 'cardamom']],
dtype='<U13')
Обратите внимание, что результирующий массив будет строкового типа (здесь максимальная длина - 13). Если вам нужен массив dtype object, который может содержать произвольные объекты, вам необходимо указать dtype=object:
res = np.array([[i for i in row if i == i] for row in data.tolist()], dtype=object)
array([['beef', 'bread', 'cane_molasses'],
['brassica', 'butter', 'cardamom']], dtype=object)
Это элегантное решение, но очень опасный фрагмент кода для включения в любой конвейер обработки данных, так как он автоматически сломается, если изменится спецификация не числа.
@PaulBrodersen, np.nan != np.nan является фундаментальным для NaN как концепция, например в документации для np.isnan указано: «NumPy использует стандарт IEEE для двоичных чисел с плавающей запятой для арифметики (IEEE 754)». Обоснование заложено в IEEE 754 (глянь сюда). Это может показаться неприличным, но и не худшее.
Извините, возможно, я был слишком неточен. Меня не беспокоит изменение стандарта not-a-number в numpy, меня беспокоит, что OP меняет способ импорта данных, например, nan становится 'nan' и т. д.
@PaulBrodersen, это справедливый вопрос, спасибо, что подняли. Мое решение действительно предполагает, что пользователь может полагаться на нулевые значения, являющиеся np.nan.
Ваш массив - 1d, shape (2,). Но в нем есть списки. Вы можете применить связанный ответ к каждому из этих списков. Для большинства целей ваш массив представляет собой список - список списков.