我想从 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]
Run Code Online (Sandbox Code Playgroud)
有一些很好的方法可以做到这一点。如果你不关心最后一个元素是 NaN,你可以使用np.diff
myarr = np.random.rand(20, 7, 11, 151, 161)
newarr = np.diff(myarr, axis=1)
Run Code Online (Sandbox Code Playgroud)
结果将具有 shape (20, 6, 11, 151, 161)。
如果您真的想保留这些 NaN,我建议您使用np.empty_likeand np.subtract。分配 withnp.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, ...])
Run Code Online (Sandbox Code Playgroud)
由于myarr[:, 1:, ...],myarr[:, :-1, ...]和newarr[:, :-1, ...]是视图,因此此操作几乎完全避免了临时数组和不必要的初始化。
| 归档时间: |
|
| 查看次数: |
3960 次 |
| 最近记录: |