【问题标题】:Pairwise mean of all elements of 2 lists2 个列表的所有元素的成对平均值
【发布时间】:2022-11-02 00:25:25
【问题描述】:

python中2个列表的所有横向均值(或总和或其他)是否有函数?

我可以编写一个嵌套循环来执行此操作:

import numpy as np

A = [1,2,3]
B = [8,12,11]

C = np.empty((len(A),len(B)))
for i, x in enumerate(A):
    for j, y in enumerate(B):
        C[i][j] = np.mean([x,y])

结果:

array([[4.5, 6.5, 6. ],
       [5. , 7. , 6.5],
       [5.5, 7.5, 7. ]])

但感觉这是一种非常迂回的方法。 我想嵌套列表理解也有一个选项,但这看起来也很丑陋。

有没有更pythonic的解决方案?

【问题讨论】:

  • 就这样做:np.add(*np.meshgrid(B, A))/2

标签: python numpy


【解决方案1】:

你在用numpy吗?如果是这样,您可以广播您的数组并在一行中实现这一点。

import numpy as np

A = [1,2,3]
B = [8,12,11]

C = (np.array(A).reshape(-1, 1) + B) / 2 # Here B will be implicitly converted to a numpy array. Thanks to @Jérôme Richard.

【讨论】:

  • 好吧,您的代码的输出是:[[4.5 6.5 6. ] [5. 7. 6.5] [5.5 7.5 7. ]]。这在我打印C 时出现。
  • 如果你打印type(C),你会发现它是一个numpy数组。 :)
  • 是的,但是您能否将其转换为所需输出的列表[4.5, 7.0, 7.0]
  • 感谢您指出这一点。但我不认为结果的类型对于这个问题很重要。提问者想要整洁和 Pythonic 的解决方案。 :) 如果提问者澄清他的意图,我将对其进行编辑。
  • 在这种情况下,当您使用 meshgrid 时,您实际上会生成两个 3x3 数组。对于reshape,您无需触及数组的底层存储。 @D b_
【解决方案2】:

我觉得你可以只使用一个 for 循环来使事情变得非常干净。通过使用zip() 函数,您可以简化代码。 O(logn) 时间复杂度最低的最佳方法之一是:

import numpy as np
A = [1,2,3]
B = [8,12,11]
C = [np.mean([x,y]) for x,y in zip(A,B)] # List Comprehension to decrease lines
print(C)

【讨论】:

  • 这给出了一个一维平均值列表,与np.mean([A,B],axis=0) 一样
【解决方案3】:

我建议这样的列表理解:

C= [[(xx+yy)/2 for yy in B] for xx in A]

【讨论】:

  • 这正是他们所做的,但在list comprehension
  • 嵌套列表理解并不像我想象的那么难看(而且绝对比我原来帖子中的嵌套循环好得多):P
猜你喜欢
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 2021-09-30
  • 2017-06-11
  • 2018-06-21
  • 1970-01-01
  • 2011-11-30
相关资源
最近更新 更多