【问题标题】:Average values in two Numpy arrays两个 Numpy 数组中的平均值
【发布时间】:2013-08-29 23:24:45
【问题描述】:

给定两个 ndarrays

old_set = [[0, 1], [4, 5]]
new_set = [[2, 7], [0, 1]]

我正在寻找两个数组之间各自值的平均值,以便数据最终类似于:

end_data = [[1, 4], [2, 3]]

基本上它会应用类似

的东西
for i in len(old_set):
    end_data[i] = (old_set[i]+new_set[i])/2

但我不确定要使用什么语法。提前感谢您的帮助!

【问题讨论】:

  • 这行不通,因为你有嵌套数组。
  • Hey Forde,您标记的答案下方的答案是更好的答案。你介意标记那个吗?

标签: python arrays numpy


【解决方案1】:

您可以创建一个包含要平均的 2D 数组的 3D 数组,然后使用 np.meannp.average 沿 axis=0 平均(后者允许加权平均):

np.mean( np.array([ old_set, new_set ]), axis=0 )

此平均方案可应用于任何(n) 维数组,因为创建的(n+1) 维数组将始终包含要沿其axis=0 平均的原始数组。

【讨论】:

  • numpy函数的出色使用。
  • 我真的很喜欢这个选项。特别是,如果你想忽略 nan:np.nanmean( np.array([ old_set, new_set ]), axis=0 )
  • 您还可以使用np.mean( np.array([ i for i in bigArr]), axis=0 ) 将其扩展到任意数量的数组,其中bigArr 由许多要平均的一维数组组成。
  • 这应该是公认的答案,因为它也支持任意数量的数组。
【解决方案2】:
>>> import numpy as np
>>> old_set = [[0, 1], [4, 5]]
>>> new_set = [[2, 7], [0, 1]]
>>> (np.array(old_set) + np.array(new_set)) / 2.0
array([[1., 4.],
       [2., 3.]])

【讨论】:

  • 除非您使用 Python 3 或使用 from __future__ import division,否则您应该除以 2.0 以确保您使用的是真正的除法而不是整数除法。
  • 显然,如果两者都已经是 np.arrays,(old_set + new_set) / 2 就足够了。只需问type(old_set),type(new_set) 提醒自己你正在处理什么。
  • @Gabriel123,根据有问题的代码,它们是列表,与提到的 OP 不同。 ;)
【解决方案3】:

使用numpy.average

numpy.average 也可以使用相同的语法:

import numpy as np
a = np.array([np.arange(0,9).reshape(3,3),np.arange(9,18).reshape(3,3)])
averaged_array = np.average(a,axis=0)

numpy.mean 相比,numpy.average 的优势在于还可以将 weights 参数用作相同形状的数组:

weighta = np.empty((3,3))    
weightb = np.empty((3,3))       
weights = np.array([weighta.fill(0.5),weightb.fill(0.8) ])
np.average(a,axis=0,weights=weights)

如果您使用掩码数组,请考虑使用numpy.ma.average,因为numpy.average don't deal with them

【讨论】:

  • numpy.average 和权重因子的好提示
【解决方案4】:

如前所述,由于嵌套列表(二维矩阵),您的解决方案不起作用。远离 numpy 方法,如果你想使用嵌套的 for 循环,你可以尝试类似的方法:

old_set = [[0, 1], [4, 5]]
new_set = [[2, 7], [0, 1]]

ave_set = []
for i in range(len(old_set)):
    row = []
    for j in range(len(old_set[0])):
        row.append( ( old_set[i][j] + new_set[i][j] ) / 2 )
    ave_set.append(row)
print(ave_set) # returns [[1, 4], [2, 3]]

【讨论】:

    猜你喜欢
    • 2015-12-08
    • 2021-04-17
    • 2015-09-29
    • 1970-01-01
    • 2020-12-09
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    相关资源
    最近更新 更多