【问题标题】:In Python. I have a list of ND arrays and I want to count duplicate arrays in order to calculate an Average for each Duplicate array value在 Python 中。我有一个 ND 数组列表,我想计算重复数组,以便计算每个重复数组值的平均值
【发布时间】:2018-02-16 07:07:05
【问题描述】:

我有一个 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,但它不适用于 ndarray。

什么是 Numpy 方式? 谢谢。

【问题讨论】:

    标签: python numpy multidimensional-array counter average


    【解决方案1】:

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

    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 转换为一维数组。我推荐@Jaime 的优秀答案使用np.void here

    它是如何工作的:

    • ua 的唯一行(通常不按原始顺序)
    • cu 的每一行在a 中重复的次数
    • inv 是让u 回到a 的索引,即u[inv] = a
    • pu 每行的乘数,根据您的要求。 1 如果c == 1c / n(其中na 中的行数)如果c > 1[:, None] 将其转换为列向量,以便它与u 一起很好地广播

    返回由[inv] 索引到其原始位置的u * p

    【讨论】:

    • 转换后现在可以使用了! [[ 1.33333333 2. 0.66666667] [ 5. 65. -1. ] [ 1.33333333 2. 0.66666667]]能否请您解释一下它是如何工作的?
    • 我还将a 转换为np.array 以便它像这样工作:a = np.array([[2,3,1],[5,65,-1],[2,3,1]])
    【解决方案2】:

    你可以使用 numpy unique ,用 count 返回 count

     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]])
    

    【讨论】:

      猜你喜欢
      • 2014-04-20
      • 2016-01-10
      • 2019-07-30
      • 2021-07-17
      • 1970-01-01
      • 2015-09-11
      • 2012-06-03
      • 1970-01-01
      • 2020-12-09
      相关资源
      最近更新 更多