我想从 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 ,这个操作几乎完全避免了临时数组和不必要的初始化。
