我有一个包含3列的2D Numpy数组。它看起来像这个array([[0, 20, 1], [1,2,1], ........, [20,1,1]])
。它基本上是列表列表的数组。如何将此矩阵转换为array([(0,20,1), (1,2,1), ........., (20,1,1)])
?我希望输出是三元组的数组。我一直在尝试使用Convert numpy array to tuple,
R = mydata #my data is sparse matrix of 1's and 0's
#First row
#R[0] = array([0,0,1,1]) #Just a sample
(rows, cols) = np.where(R)
vals = R[rows, cols]
QQ = zip(rows, cols, vals)
QT = tuple(map(tuple, np.array(QQ))) #type of QT is tuple
QTA = np.array(QT) #type is array
#QTA gives an array of lists
#QTA[0] = array([0, 2, 1])
#QTA[1] = array([0, 3, 1])
但是所需的输出是QTA应该是元组数组,即QTA = array([(0,2,1),(0,3,1)])。
答案 0 :(得分:2)
您的2d数组不是列表列表,但很容易转换为
a.tolist()
正如Jimbo所示,您可以将其转换为带有comprehension
的元组列表(a map
也可以)。但是当你尝试将它包装在一个数组中时,你会再次得到2d数组。这是因为np.array
尝试创建与数据允许的大小相同的数组。并且子列表(或元组)的长度都相同,那就是2d数组。
要保留元组,您必须切换到结构化数组。例如:
a = np.array([[0, 20, 1], [1,2,1]])
a1=np.empty((2,), dtype=object)
a1[:]=[tuple(i) for i in a]
a1
# array([(0, 20, 1), (1, 2, 1)], dtype=object)
在这里,我使用dtype object
创建一个空结构化数组,这是最常见的类型。然后我使用元组列表分配值,这是此任务的正确数据结构。
替代dtype是
a1=np.empty((2,), dtype='int,int,int')
....
array([(0, 20, 1), (1, 2, 1)],
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4')])
或者只需一步:np.array([tuple(i) for i in a], dtype='int,int,int')
a1=np.empty((2,), dtype='(3,)int')
生成2d数组。 dt=np.dtype([('f0', '<i4', 3)])
生成
array([([0, 20, 1],), ([1, 2, 1],)],
dtype=[('f0', '<i4', (3,))])
在元组中嵌入1d数组。所以它看起来像object
或3个字段是我们最接近元组数组。
答案 1 :(得分:1)
不是很好的解决方案,但这会奏效:
# take from your sample
>>>a = np.array([[0, 20, 1], [1,2,1], [20,1,1]])
# construct an empty array with matching length
>>>b = np.empty((3,), dtype=tuple)
# manually put values into tuple and store in b
>>>for i,n in enumerate(a):
>>> b[i] = (n[0],n[1],n[2])
>>>b
array([(0, 20, 1), (1, 2, 1), (20, 1, 1)], dtype=object)
>>>type(b)
numpy.ndarray