Преобразовать набор кортежей в простой массив списков в Python
Итак, я использовал метод set "симметричное_дифференциал" между двумя матрицами ndarray следующим образом:
x_set = list(set(tuple(i) for i in x_spam_matrix.tolist()).symmetric_difference(
set(tuple(j) for j in partitioned_x[i].tolist())))
x = np.array([list(i) for i in x_set])
этот метод работает хорошо для меня, но он немного неуклюжий... есть ли способ провести это немного более элегантно?
2 ответа
Решение
Простой список кортежей:
In [146]: alist = [(1,2),(3,4),(2,1),(3,4)]
положить его в набор:
In [147]: aset = set(alist)
In [148]: aset
Out[148]: {(1, 2), (2, 1), (3, 4)}
np.array
просто обертки, которые установлены в объекте dtype:
In [149]: np.array(aset)
Out[149]: array({(1, 2), (3, 4), (2, 1)}, dtype=object)
но сделайте это в виде списка и получите 2d массив:
In [150]: np.array(list(aset))
Out[150]:
array([[1, 2],
[3, 4],
[2, 1]])
Поскольку это список кортежей, его также можно преобразовать в структурированный массив:
In [151]: np.array(list(aset),'i,f')
Out[151]: array([(1, 2.), (3, 4.), (2, 1.)], dtype=[('f0', '<i4'), ('f1', '<f4')])
Если длина кортежей различна, список кортежей будет превращен в 1d массив кортежей (объект dtype):
In [152]: np.array([(1,2),(3,4),(5,6,7)])
Out[152]: array([(1, 2), (3, 4), (5, 6, 7)], dtype=object)
In [153]: _.shape
Out[153]: (3,)
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
[...]
В вашем коде нет ничего плохого. Хотя, если бы мне пришлось пересмотреть код, я бы предложил следующее
spam_matrix_set = set(tuple(item) for item in x_spam_matrix.tolist())
partitioned_set = set(tuple(item) for item in partitioned_x[index].tolist())
disjunctive_union = spam_matrix_set.symmetric_difference(partitioned_set)
x = np.array([list(item) for item in disjunctive_union])