Удаление nan из строкового массива

У меня есть следующий массив:

data=array([['beef', 'bread', 'cane_molasses', nan, nan, nan],
       ['brassica', 'butter', 'cardamom']])

Как удалить нан, чтобы получить:

 array([['beef', 'bread', 'cane_molasses'],
       ['brassica', 'butter', 'cardamom']])

Я пробовал метод, указанный в здесь, но это не работает, поскольку в моем случае мой массив имеет более высокую размерность и не является простым вектором.

Ваш массив - 1d, shape (2,). Но в нем есть списки. Вы можете применить связанный ответ к каждому из этих списков. Для большинства целей ваш массив представляет собой список - список списков.

hpaulj 12.11.2018 18:07
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Массивы 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)

Это элегантное решение, но очень опасный фрагмент кода для включения в любой конвейер обработки данных, так как он автоматически сломается, если изменится спецификация не числа.

Paul Brodersen 13.11.2018 23:26

@PaulBrodersen, np.nan != np.nan является фундаментальным для NaN как концепция, например в документации для np.isnan указано: «NumPy использует стандарт IEEE для двоичных чисел с плавающей запятой для арифметики (IEEE 754)». Обоснование заложено в IEEE 754 (глянь сюда). Это может показаться неприличным, но и не худшее.

jpp 13.11.2018 23:39

Извините, возможно, я был слишком неточен. Меня не беспокоит изменение стандарта not-a-number в numpy, меня беспокоит, что OP меняет способ импорта данных, например, nan становится 'nan' и т. д.

Paul Brodersen 13.11.2018 23:41

@PaulBrodersen, это справедливый вопрос, спасибо, что подняли. Мое решение действительно предполагает, что пользователь может полагаться на нулевые значения, являющиеся np.nan.

jpp 13.11.2018 23:43

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