将列表数组转换为元组/三元组数组

时间:2014-10-29 15:37:36

标签: python numpy scipy

我有一个包含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)])。

2 个答案:

答案 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