Построение Python установлено от матрицы Numpy

Я пытаюсь выполнить следующее

>> from numpy import *
>> x = array([[3,2,3],[4,4,4]])
>> y = set(x)
TypeError: unhashable type: 'numpy.ndarray'

Как может я легко и эффективно создавать набор со всеми элементами от массива Numpy?

17
задан Eric O Lebigot 14 September 2018 в 08:12
поделиться

3 ответа

Если вам нужен набор elements, вот другой, возможно, более быстрый способ:

y = set(x.flatten())

PS: после сравнения между x.flat , x.flatten () и x.ravel () Я обнаружил, что на массиве 10x100 все они работают примерно с одинаковой скоростью. Для массива 3x3 самой быстрой версией является версия итератора:

y = set(x.flat)

, которую я бы рекомендовал, потому что это версия с меньшим объемом памяти (она хорошо масштабируется с размером массива).

PS : Существует также функция NumPy, которая делает нечто подобное:

y = numpy.unique(x)

Это создает массив NumPy с тем же элементом, что и set (x.flat) , но в виде массива NumPy. Это очень быстро (почти в 10 раз быстрее), но если вам нужен набор , то выполнение set (numpy.unique (x)) будет немного медленнее, чем другие процедуры ( сборка набора связана с большими накладными расходами).

28
ответ дан 30 November 2019 в 10:36
поделиться

Неизменяемым аналогом массива является кортеж, поэтому попробуйте преобразовать массив массивов в массив кортежей:

>> from numpy import *
>> x = array([[3,2,3],[4,4,4]])

>> x_hashable = map(tuple, x)

>> y = set(x_hashable)
set([(3, 2, 3), (4, 4, 4)])
14
ответ дан 30 November 2019 в 10:36
поделиться

Если вам нужен набор элементов:

>> y = set(e for r in x
             for e in r)
set([2, 3, 4])

Для набора строк:

>> y = set(tuple(r) for r in x)
set([(3, 2, 3), (4, 4, 4)])
3
ответ дан 30 November 2019 в 10:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: