【问题标题】:In place difference between elements of a Numpy arrayNumpy数组元素之间的就地差异
【发布时间】:2013-01-28 19:07:54
【问题描述】:

这将是一个相当简单的问题,我想知道在 Python 中是否有一个快速而干净的解决方法。

假设我有一个这样定义的 nd 数组:

In [10]: C = np.random.rand(2,3,3)

In [11]: C
Out[11]: 
array([[[ 0.43588471,  0.06600133,  0.81145749],
        [ 0.20270693,  0.85879686,  0.75778422],
        [ 0.68253449,  0.98287412,  0.63804605]],

       [[ 0.61591433,  0.36453861,  0.23798795],
        [ 0.26761896,  0.00657165,  0.04083067],
        [ 0.11177481,  0.55245769,  0.97274592]]])

然后我计算第 3 维数组中一个值与前一个值之间的差,如下所示:

In [12]: C[:, :, 1:] = C[:, :, 1:] - C[:, :, 0:C.shape[2]-1]

In [13]: C
Out[13]: 
array([[[ 0.43588471, -0.36988337,  0.74545616],
        [ 0.20270693,  0.65608994, -0.10101264],
        [ 0.68253449,  0.30033963, -0.34482807]],

       [[ 0.61591433, -0.25137572, -0.12655065],
        [ 0.26761896, -0.26104731,  0.03425902],
        [ 0.11177481,  0.44068288,  0.42028823]]])

是否可以使用类似的技术恢复到原始值,或者我是否必须使用 for 循环和临时变量?

例如,这不起作用:

In [15]: C[:, :, 1:] = C[:, :, 0:C.shape[2]-1] + C[:, :, 1:]

In [16]: C
Out[16]: 
array([[[ 0.43588471,  0.06600133,  0.37557278],
        [ 0.20270693,  0.85879686,  0.5550773 ],
        [ 0.68253449,  0.98287412, -0.04448843]],

       [[ 0.61591433,  0.36453861, -0.37792638],
        [ 0.26761896,  0.00657165, -0.22678829],
        [ 0.11177481,  0.55245769,  0.86097111]]])

【问题讨论】:

    标签: python numpy array-difference


    【解决方案1】:

    首先,计算差异,而不是

    C[:, :, 1:] - C[:, :, 0:C.shape[2]-1]
    

    你可以使用numpy.diff:

    np.diff(C, axis = -1)
    

    In [27]: C = np.random.rand(2,3,3)
    
    In [28]: D = C[:, :, 1:] - C[:, :, 0:C.shape[2]-1]
    
    In [29]: E = np.diff(C, axis = -1)
    
    In [30]: np.allclose(D, E)
    Out[30]: True
    

    接下来,如果您知道要检索原始的C,也许最好不要一开始就覆盖这些值。只需将差异保存在单独的数组中即可:

    E = np.diff(C, axis = -1)
    

    毕竟,没有比完全不计算更快的方法来执行计算了:)。

    但如果您确实想覆盖这些值,那么,要检索原始值,请使用np.cumsum

    In [20]: C = np.random.rand(2,3,3)
    
    In [21]: D = C.copy()
    
    In [22]: C[:, :, 1:] = np.diff(C, axis = -1)
    
    In [23]: C = np.cumsum(C, axis = -1)
    
    In [24]: np.allclose(C,D)
    Out[24]: True
    

    【讨论】:

      猜你喜欢
      • 2012-06-21
      • 2014-10-20
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多