Skip to main content
 首页 » 编程设计

python之Numpy 下一个元素减去上一个

2025年05月04日19lovecherry

我想从 numpy 数组的特定轴上的当前元素中减去下一个元素。但是,我知道如何使用大量循环来做到这一点。我的问题是:如何以最有效的方式做到这一点?也许使用 numpy?

我的 Python 代码如下:

import numpy as np 
 
np.random.seed(0) 
 
myarr = np.random.rand(20, 7, 11, 151, 161) 
 
newarr = np.full((20, 6, 11, 151, 161), np.nan) 
 
for iyr in range(20): 
    for iwk in range(6): 
        for imb in range(11): 
            for ilat in range(151): 
                for ilon in range(161): 
                     newarr[iyr, iwk, imb, ilat, ilon] = myarr[iyr, iwk + 1, imb, ilat, ilon] - myarr[iyr, iwk, imb, ilat, ilon] 

请您参考如下方法:

有一些很好的方法可以做到这一点。如果你不关心最后一个元素是 NaN,你可以使用 np.diff

myarr = np.random.rand(20, 7, 11, 151, 161) 
newarr = np.diff(myarr, axis=1) 

结果的形状为 (20, 6, 11, 151, 161)。

如果您真的想保留这些 NaN,我建议您使用 np.empty_like和 np.subtract .分配 np.full有点浪费,因为您肯定设置了几乎所有元素。您拥有的唯一 NaN 位于第二个维度的最后一个索引中,您可以自己以非常低的成本对其进行初始化:

myarr = np.random.rand(20, 7, 11, 151, 161) 
newarr = np.empty_like(myarr)  # Don't repeat shape 
newarr[:, -1, ...] = np.nan 
np.subtract(myarr[:, 1:, ...], myarr[:, :-1, ...], out=newarr[:, :-1, ...]) 

自 myarr[:, 1:, ...],myarr[:, :-1, ...] 和 newarr[:, :-1, ...] 是 View ,这个操作几乎完全避免了临时数组和不必要的初始化。