【问题标题】:fast element nodal averaging using numpy使用 numpy 进行快速元素节点平均
【发布时间】:2018-06-13 07:06:25
【问题描述】:

我在 Windows 上使用 Python 3.6.2 和 numpy。

我有两个数组,

一个整数数组 [I1, I2, I3, I4]

一个浮点值数组 [VI1, VI2, VI3, Vi4]

数组长度相同

第一个数组中的整数可以重复

第二个数组中的值与第一个数组中相同位置的整数相关联。

对于第一个数组中的每个唯一整数,我需要在第一个数组中找到该整数的所有出现,然后计算第二个数组中相应位置的所有值的平均值。

给定一个索引数组 [1, 5, 7, 5, 9, 7, 4]

和一个值数组 [9, 4, 8, 7, 2, 8, 6]

1、9 和 4 在索引数组中出现一次,并与值 9、2 和 6 相关联,这些值也是这些索引的平均值。

5 在索引数组中出现两次,关联值为 4 和 7 - avg 5.5 7 在索引数组中出现两次,关联值为 8 和 8 - avg 8.0

数组可以非常大 - 多达 1 亿个。

当然,这很容易暴力破解,但是在 Python/numpy 中是否有一种快速且内存高效的方法来实现这一点?

提前致谢,

道格

【问题讨论】:

    标签: python algorithm numpy


    【解决方案1】:

    您可以使用 numpy ufuncsnp.bincount

    s = np.zeros(i.max())
    np.add.at(s, v, i)
    c = np.bincount(i)
    idx = np.nonzero(c)
    out = s[idx] / c[idx]
    

    编辑:正如@Divakar 指出的那样,您可以这样做

    def nodal_average(i, v):
        s = np.bincount(i, v)
        c = np.bincount(i)
        idx = np.nonzero(c)
        out = s[idx] / c[idx]
        return idx, out
    

    【讨论】:

    • 或者简单地说:np.bincount(i,v)?
    • 感谢 Daniel,感谢 Divakar - 这太棒了。明天我会在一些大型数据集上尝试一下!!!!
    【解决方案2】:

    一个非常简单的解决方案是只使用 Pandas 并查看它的扩展能力

    import numpy as np
    import pandas as pd
    
    i = np.array([1, 5, 7, 5, 9, 7, 4])
    v = np.array([9, 4, 8, 7, 2, 8, 6])
    
    
    d = pd.DataFrame({'i': i, 'v': v})
    d = d.groupby('i').mean()
    

    给了

       v
    i     
    1  9.0
    4  6.0
    5  5.5
    7  8.0
    9  2.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 2018-07-25
      • 2017-07-08
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      • 2014-02-06
      相关资源
      最近更新 更多