Как преобразовать набор python в массив numpy? - PullRequest
27 голосов
/ 11 декабря 2011

Я использую операцию set в python, чтобы выполнить симметричную разницу между двумя массивами numpy.Результатом, однако, является набор, и мне нужно преобразовать его обратно в массивный массив для продвижения вперед.Есть ли способ сделать это?Вот что я попробовал:

a = numpy.array([1,2,3,4,5,6])
b = numpy.array([2,3,5])
c = set(a) ^ set(b)

В результате получается набор:

In [27]: c
Out[27]: set([1, 4, 6])

Если я преобразую в пустой массив, он помещает весь набор в первый элемент массива.

In [28]: numpy.array(c)
Out[28]: array(set([1, 4, 6]), dtype=object)

Однако мне нужно было бы следующее:

array([1,4,6],dtype=int)

Я мог бы перебирать элементы для преобразования по одному, но у меня будет 100 000 элементов, и я надеялся навстроенная функция для сохранения цикла.Спасибо!

Ответы [ 4 ]

36 голосов
/ 11 декабря 2011

Do:

>>> numpy.array(list(c))
array([1, 4, 6])

И dtype это int (int64 на моей стороне.)

28 голосов
/ 11 декабря 2011

Не конвертируйте массив numpy в набор для выполнения исключающего или.Используйте setxor1d напрямую.

>>> import numpy
>>> a = numpy.array([1,2,3,4,5,6])
>>> b = numpy.array([2,3,5])
>>> numpy.setxor1d(a, b)
array([1, 4, 6])
7 голосов
/ 11 декабря 2011

Попробуй это.

numpy.array(list(c))

Преобразование в список перед инициализацией массива numpy установит для отдельных элементов целое число, а не первый элемент в качестве объекта.

1 голос
/ 10 июля 2019

Попробуйте:

numpy.fromiter(c, int, len(c))

Это в два раза быстрее, чем решение со списком в качестве среднего продукта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...