元素明智地组合 numpy 数组的列表

Posted

技术标签:

【中文标题】元素明智地组合 numpy 数组的列表【英文标题】:element wise combine list of numpy arrays 【发布时间】:2018-05-13 18:54:01 【问题描述】:

我正在尝试做一些 numpy 数组的线性组合。

我有三个 numpy 数组列表:

a = [np.random.normal(0,1, [1,2]), np.random.normal(0,1, [3,4]), np.random.normal(0,1, [10,11])] b = [np.random.normal(0,1, [1,2]), np.random.normal(0,1, [3,4]), np.random.normal(0,1, [10,11])] c = [np.random.normal(0,1, [1,2]), np.random.normal(0,1, [3,4]), np.random.normal(0,1, [10,11])]

我想根据相应元素的值 c 逐元素组合列表 ab 中每个数组中的每个元素,以获得一个新列表 d:说 d_i = a_i * c_i + (1-c_i) *b_i(线性组合)。

我的想法是在a 中的每个数组中选择每个元素,并在bc 中找到对应的元素,然后组合。但是,我发现这很麻烦,效率低下而且有点愚蠢。有人可以提出更好的方法吗?

【问题讨论】:

我不明白你在做什么 添加了d_i = a_i * c_i + (1-c_i) *b_i,其中每个变量表示列表中每个数组中的每个元素。 为什么会有数组列表? 【参考方案1】:

好吧,假设您的所有列表长度都相同,那么我认为没有比这更有效的方法了

d = [a[i] * c[i] + (1-c[i]) * b[i] for i in range(len(a))]

现在,如果您只需对列表d 进行一次操作,那么您是否可以通过生成器理解来加快速度?

d = (a[i] * c[i] + (1-c[i]) * b[i] for i in range(len(a)))

但归根结底,没有办法在少于线性的时间内创建元素的线性组合。

【讨论】:

理想情况下,列表推导是创建列表最有效的方法。但是,正如您所说,如果您有进一步的操作,最好推迟创建列表。 哇,你真聪明! @xaav 我可以更新以使用列表推导,但生成器推导确实是最有效的,因为如果列表仅被遍历一次,它不会不必要地保存任何内容。 你让我想起了d = [], for x, y, z in zip(a,b, c): d.append(z*x + (1-z) *y),有没有人能在这条路上搭讪? 这取决于你们所说的“高效”是什么意思。在构造列表时,列表推导比等效的 for 循环略快。如果您实际上不需要列表,而只需要处理每个元素,那么生成器表达式或某种形式的惰性迭代将是理想的。

以上是关于元素明智地组合 numpy 数组的列表的主要内容,如果未能解决你的问题,请参考以下文章

如何明智地连接多个列表元素

元素明智的连接与Python中的两个列表列表

检查numpy数组中的每个元素是否在单独的列表中

使用列表中的随机元素创建 numpy 数组

列表列表到 numpy 数组中

numpy数组列表中N个最高元素的索引[重复]