如何将元组对列表(索引、值)转换为2D numpy数组

2024-09-27 18:02:54 发布

您现在位置:Python中文网/ 问答频道 /正文

有一个元组列表:

[[(0, 0.5), (1, 0.6)], [(4, 0.01), (5, 0.005), (6, 0.002)], [(1,0.7)]]

我需要得到矩阵X Y:

x = num of sublists
y = max among second eleme throught all pairs
elem[x,y] = second elem for x sublist if first elem==Y 
^{tb1}$

Tags: of列表for矩阵allnummax元组
2条回答

可以通过以下方法计算数组的维度。Y维度是子列表的数量

>>> data = [[(0, 0.5), (1, 0.6)], [(4, 0.01), (5, 0.005), (6, 0.002)], [(1,0.7)]]
>>> dim_y = len(data)
>>> dim_y
3

X维是所有元组中最大的[0]索引,加上1

>>> dim_x = max(max(i for i,j in sub) for sub in data) + 1
>>> dim_x
7

然后用这个大小初始化一个全零数组

>>> import numpy as np
>>> arr = np.zeros((dim_x, dim_y))
>>> arr
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

现在要填充它,enumerate覆盖子列表以跟踪y索引。然后,对于每个子列表,使用[0]作为x索引,使用[1]作为值本身

for y, sub in enumerate(data):
    for x, value in sub:
        arr[x,y] = value

然后,应填充生成的数组(可能希望将其转置为与所需的维度类似)

>>> arr.T
array([[0.5  , 0.6  , 0.   , 0.   , 0.   , 0.   , 0.   ],
       [0.   , 0.   , 0.   , 0.   , 0.01 , 0.005, 0.002],
       [0.   , 0.7  , 0.   , 0.   , 0.   , 0.   , 0.   ]])

正如我在接受的答案中所评论的那样,data是“参差不齐”的,不能组成数组

现在,如果数据具有更规则的形式,则无循环解决方案是可能的。但是转换成这种形式需要同样的双循环

In [814]: [(i,j,v) for i,row in enumerate(data) for j,v in row]
Out[814]: 
[(0, 0, 0.5),
 (0, 1, 0.6),
 (1, 4, 0.01),
 (1, 5, 0.005),
 (1, 6, 0.002),
 (2, 1, 0.7)]

“转置”并分为3个变量:

In [815]: I,J,V=zip(*_)
In [816]: I,J,V
Out[816]: ((0, 0, 1, 1, 1, 2), (0, 1, 4, 5, 6, 1), (0.5, 0.6, 0.01, 0.005, 0.002, 0.7))

我在这里坚持使用列表转置,以便不将整数索引转换为浮点。它也可能更快,因为从列表中生成数组并不是一项简单的任务

现在我们可以通过numpy魔术来赋值:

In [819]: arr = np.zeros((3,7))
In [820]: arr[I,J]=V
In [821]: arr
Out[821]: 
array([[0.5  , 0.6  , 0.   , 0.   , 0.   , 0.   , 0.   ],
       [0.   , 0.   , 0.   , 0.   , 0.01 , 0.005, 0.002],
       [0.   , 0.7  , 0.   , 0.   , 0.   , 0.   , 0.   ]])

I,J,V也可以用作scipy.sparse.coo_matrix调用的输入,生成稀疏矩阵

说到稀疏矩阵,这里是稀疏版本的arr的样子:

在列表格式中:

In [822]: from scipy import sparse
In [823]: M = sparse.lil_matrix(arr)
In [824]: M
Out[824]: 
<3x7 sparse matrix of type '<class 'numpy.float64'>'
    with 6 stored elements in List of Lists format>
In [825]: M.A
Out[825]: 
array([[0.5  , 0.6  , 0.   , 0.   , 0.   , 0.   , 0.   ],
       [0.   , 0.   , 0.   , 0.   , 0.01 , 0.005, 0.002],
       [0.   , 0.7  , 0.   , 0.   , 0.   , 0.   , 0.   ]])
In [826]: M.rows
Out[826]: array([list([0, 1]), list([4, 5, 6]), list([1])], dtype=object)
In [827]: M.data
Out[827]: 
array([list([0.5, 0.6]), list([0.01, 0.005, 0.002]), list([0.7])],
      dtype=object)

以及更常见的coo格式:

In [828]: Mc=M.tocoo()
In [829]: Mc.row
Out[829]: array([0, 0, 1, 1, 1, 2], dtype=int32)
In [830]: Mc.col
Out[830]: array([0, 1, 4, 5, 6, 1], dtype=int32)
In [831]: Mc.data
Out[831]: array([0.5  , 0.6  , 0.01 , 0.005, 0.002, 0.7  ])

以及大多数计算中使用的csr:

In [832]: Mr=M.tocsr()
In [833]: Mr.data
Out[833]: array([0.5  , 0.6  , 0.01 , 0.005, 0.002, 0.7  ])
In [834]: Mr.indices
Out[834]: array([0, 1, 4, 5, 6, 1], dtype=int32)
In [835]: Mr.indptr
Out[835]: array([0, 2, 5, 6], dtype=int32)

相关问题 更多 >

    热门问题