Я пытаюсь выполнить следующее
>> from numpy import *
>> x = array([[3,2,3],[4,4,4]])
>> y = set(x)
TypeError: unhashable type: 'numpy.ndarray'
Как может я легко и эффективно создавать набор со всеми элементами от массива Numpy?
Если вам нужен набор 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))
будет немного медленнее, чем другие процедуры ( сборка набора связана с большими накладными расходами).
Неизменяемым аналогом массива является кортеж, поэтому попробуйте преобразовать массив массивов в массив кортежей:
>> 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)])
Если вам нужен набор элементов:
>> 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)])