2024-09-27 18:02:54 发布
网友
有一个元组列表:
[[(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
可以通过以下方法计算数组的维度。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
[0]
>>> 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]作为值本身
enumerate
[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是“参差不齐”的,不能组成数组
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魔术来赋值:
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调用的输入,生成稀疏矩阵
I,J,V
scipy.sparse.coo_matrix
说到稀疏矩阵,这里是稀疏版本的arr的样子:
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格式:
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)
可以通过以下方法计算数组的维度。Y维度是子列表的数量
X维是所有元组中最大的
[0]
索引,加上1然后用这个大小初始化一个全零数组
现在要填充它,
enumerate
覆盖子列表以跟踪y索引。然后,对于每个子列表,使用[0]
作为x索引,使用[1]
作为值本身然后,应填充生成的数组(可能希望将其转置为与所需的维度类似)
正如我在接受的答案中所评论的那样,
data
是“参差不齐”的,不能组成数组现在,如果数据具有更规则的形式,则无循环解决方案是可能的。但是转换成这种形式需要同样的双循环
“转置”并分为3个变量:
我在这里坚持使用列表转置,以便不将整数索引转换为浮点。它也可能更快,因为从列表中生成数组并不是一项简单的任务
现在我们可以通过
numpy
魔术来赋值:I,J,V
也可以用作scipy.sparse.coo_matrix
调用的输入,生成稀疏矩阵说到稀疏矩阵,这里是稀疏版本的
arr
的样子:在列表格式中:
以及更常见的
coo
格式:以及大多数计算中使用的csr:
相关问题 更多 >
编程相关推荐