2

我有一个生成器g,我事先知道它会返回n项目。每个项目i的结构如下:

t_i:(e_i, b_i)

t_i是一个可变大小的元组,可以包含 list 的任何有序子序列(1,...,n)。例如,对于n=6t_1=(1, 3, 4)t_2=(2, 4, 6)

e_i是一个数字(浮点数/整数),并且b_i是一个布尔值(这里没有真正使用)。

n x n我想知道使用以下方式构造矩阵(使用 numpy 数组)的最有效方法是g什么

矩阵的每一行i对应t_i:(e_i, b_i)于: 1. 位置出现的行元素(在矩阵中)t_i应该使用e_i; 2. 其他行元素默认为0.

因此,例如,假设矩阵2的那一行8 x 8对应于 item t_2:(e_2, b_2) = (2, 4, 6):(13, True),则该行应设置为(0, 13, 0, 13, 0, 13, 0, 0)t_2请注意,我们在这里(或t_i一般情况下)没有对数字使用零索引。

一个明显的方法是提前构造一个n x n矩阵,然后遍历生成器返回的每一个item,根据item依次设置每一行。但鉴于 Python 的强大功能,numpy尤其是 Python 的强大功能,我觉得必须有一些更有效的方法来做到这一点。

4

1 回答 1

1

在 Numpy 中构造一个 n×n 矩阵既简单又相当有效。通过使用高级索引来设置行,我们可以获得一个非常简单有效的实现:

arr = np.zeros((n,n))
for i,(t,e,b) in enumerate(g):
    arr[i,np.array(t) - 1] = e

请注意,这假设g生成形式为 的元组(ti, ei, bi)

于 2012-10-24T16:35:39.960 回答