Skip to main content
 首页 » 编程设计

python之使用生成器的值在 numpy 中构建方阵的最有效方法

2025年05月04日8飞鱼

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

t_i:(e_i, b_i)

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

e_i 是一个数字( float /整数),b_i 是一个 bool 值(这里并没有真正使用)。

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

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

例如,假设 8 x 8 矩阵的行 2 对应于项目 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矩阵,然后遍历生成器返回的每个项目,并根据项目顺序设置每一行。但鉴于 Python 的强大功能,尤其是 numpy 的强大功能,我觉得必须有一些更有效的方法来做到这一点。

请您参考如下方法:

在 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) 形式的元组。