【问题标题】:Numpy - Average distance between columnsNumpy - 列之间的平均距离
【发布时间】:2017-10-27 14:59:33
【问题描述】:

我有一个二维数组,我想在考虑每一行的情况下计算每列之间的平均距离。

例如,如果我有二维数组:

2  2  3
4  2  5
1  5  2

我想计算所有行中第 1 列和第 2 列之间、所有行中第 1 列和第 3 列之间以及所有行中第 2 列和第 3 列之间的平均距离。

第 1 列和第 2 列的平均距离为 ( |2-2| + |4-2| + |1-5| ) / 3,等于 2。

有没有一个 numpy 函数可以完成这个?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    这样的?

    import numpy as np
    x = np.array([[2,2,3],[4,2,5],[1,5,2]])
    
    def calc(cols):
        return np.mean(np.abs(np.diff(x[:, cols])))
    
    print(calc([0,1]))
    

    输出:

    2.0
    

    同时考虑:

    import itertools
    print(list(itertools.combinations(range(x.shape[1]), 2)))  # outer list because using py3
    

    输出:

    [(0, 1), (0, 2), (1, 2)]
    

    【讨论】:

    • 是的,这就是我想要的!有没有办法为每个可能的列排列运行calc,而不是手动指定列?
    • 要么准备一个 for 循环(消除对称性),要么使用 itertools 准备所有组合。
    【解决方案2】:

    我建议这样做:

    from scipy.spatial.distance import pdist
    m, n = in_arr.shape
    pdist(in_arr.T, 'cityblock') / m
    
    Out: array([ 2.        ,  1.        ,  2.33333333])
    

    如果您想知道哪个距离与哪个对相关,请使用:

    np.stack(np.triu_indices(n, 1))  
    
    Out: 
    array([[0, 0, 1],
           [1, 2, 2]], dtype=int32)
    

    这应该比使用for 循环或itertools 快​​得多

    【讨论】:

      猜你喜欢
      • 2017-04-10
      • 1970-01-01
      • 2015-02-02
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      相关资源
      最近更新 更多