在Python中。我有一个ND数组列表,我想计算重复数组,以计算每个Duplicate数组值的平均值

问题描述 投票:1回答:2

我有一个ND阵列(矢量)列表,每个矢量都有一个(1,300)形状。 我的目标是在列表中找到重复的向量,对它们求和,然后将它们除以列表的大小,结果值(向量)将替换重复的向量。 例如,a是ND数组的列表,a = [[2,3,1],[5,65,-1],[2,3,1]],然后第一个和最后一个元素是重复的。他们的sum将是:[4,6,2],将按照矢量列表size = 3的大小进行划分。

输出:a = [[4/3,6/3,2/3],[5,65,-1],[4/3,6/3,2/3]]

我曾尝试使用Counter,但它不适用于ndarrays。

Numpy的方式是什么?谢谢。

python numpy multidimensional-array counter average
2个回答
1
投票

如果你有1.13或更高的numpy,这很简单:

def f(a):
    u, inv, c = np.unique(a, return_counts = True, return_inverse = True, axis = 0)
    p = np.where(c > 1,  c / a.shape[0], 1)[:, None]
    return (u * p)[inv]

如果你没有1.13,你需要一些技巧来首先将a转换为1-d数组。我推荐@ Jaime使用np.void here的优秀答案

这个怎么运作:

  • ua的独特行(通常不是原始顺序)
  • c是在u重复每排a的次数
  • inv是让u回到a的指数,即u[inv] = a
  • p是根据您的要求每排u的乘数。 1 if c == 1c / n(其中na的行数)如果c > 1[:, None]将其转换为列向量,以便与u进行良好的广播

返回u * p[inv]索引回原来的位置


0
投票

您可以使用numpy unique,带计数返回计数

 elements, count = np.unique(a, axis=0, return_counts=True)

返回计数允许返回数组中每个元素的出现次数

输出是这样的,

(array([[ 2,  3,  1],
        [ 5, 65, -1]]), array([2, 1]))

然后你可以像这样乘以它们:

(count * elements.T).T

输出:

array([[ 4,  6,  2],
       [ 5, 65, -1]])
© www.soinside.com 2019 - 2024. All rights reserved.