元素明智地组合 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
逐元素组合列表 a
和 b
中每个数组中的每个元素,以获得一个新列表 d
:说 d_i = a_i * c_i + (1-c_i) *b_i
(线性组合)。
我的想法是在a
中的每个数组中选择每个元素,并在b
和c
中找到对应的元素,然后组合。但是,我发现这很麻烦,效率低下而且有点愚蠢。有人可以提出更好的方法吗?
【问题讨论】:
我不明白你在做什么 添加了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 数组的列表的主要内容,如果未能解决你的问题,请参考以下文章