Преобразование массива в список в Python

У меня есть массив A. Я хочу идентифицировать все местоположения с элементом 1 и преобразовать его в список, как показано в ожидаемом результате. Но я получаю сообщение об ошибке.

import numpy as np

A=np.array([0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

B=np.where(A==1)

B=B.tolist()
print(B)

Ошибка

in <module>
    B=B.tolist()

AttributeError: 'tuple' object has no attribute 'tolist'

Ожидаемый результат

[1, 2, 5, 7, 10, 11]

Вы пробовали напечатать B перед тем, как вызвать tolist?

Plagon 14.02.2023 11:39

Добро пожаловать в Stack Overflow. Пожалуйста, подумайте хорошенько над логикой. «Я хочу идентифицировать все местоположения с элементом 1 и преобразовать его в список, как показано в ожидаемом результате». - что вы хотите "конвертировать"? Это не исходный массив A, а местоположения, которые вы получили от вызова .where - верно? Так. Является ли этот результат массивом? Что вместо этого?

Karl Knechtel 14.02.2023 11:48

Также прочтите ericlippert.com/2014/03/05/how-to-debug-small-programs и постарайтесь изучить проблемы, прежде чем спрашивать. Например, если вы получаете сообщение об ошибке из такого кода, как B=B.tolist(), то должно быть ясно, что существует проблема с попыткой использовать .tolist на B, поэтому следующим шагом в рассуждениях о проблеме должна быть проверка того, что такое B. . Когда вы это сделаете, вы обнаружите, что у вас обычный Python tuple, а не массив Numpy. Затем вы можете увидеть, что находится в этом кортеже: один элемент, представляющий собой массив, который вам нужен.

Karl Knechtel 14.02.2023 11:49
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
Учебник по веб-скрапингу
Учебник по веб-скрапингу
Привет, ребята... В этот раз мы поговорим о веб-скрейпинге. Целью этого обсуждения будет узнать и понять, что такое веб-скрейпинг, а также узнать, как...
Тонкая настройка GPT-3 с помощью Anaconda
Тонкая настройка GPT-3 с помощью Anaconda
Зарегистрируйте аккаунт Open ai, а затем получите ключ API ниже.
1
3
52
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

import numpy as np

A = np.array([0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

indices = np.where(A == 1)[0]
B = indices.tolist()

print(B)

Вы должны получить доступ к первому элементу этого кортежа с помощью B[0] :

import numpy as np

A=np.array([0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

B=np.where(A==1)

B = B[0].tolist()
print(B) # [1, 2, 5, 7, 10, 11]
Ответ принят как подходящий

Np.where используется только с условием, возвращает кортеж массивов, содержащих индексы; один массив для каждого измерения массива. Согласно документам, это очень похоже на np.nonzero, что является рекомендуемым подходом по сравнению с np.where. Итак, поскольку ваш массив одномерный, np.where вернет кортеж с одним элементом, внутри которого находится массив, содержащий индексы в ожидаемом результате. Вы можете решить свою проблему, обратившись к кортежу, например np.where(A == 1)[0].tolist().

Однако вместо этого я рекомендую использовать np.flatnonzero, что полностью избавляет от хлопот:

import numpy as np

A = np.array([0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

B = np.flatnonzero(A).tolist()

Б:

[1, 2, 5, 7, 10, 11]

PS: когда все остальные элементы равны 0, вам не нужно явно сравнивать с 1;).

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