我正在尝试将多维数据集中的所有值设置为零以上。
我尝试了以下方法:
cube_tot_lo.data = np.where(cube_tot_lo.data < 1.0e19, cube_tot_lo.data, 0.0)
但它是一个大型立方体并杀死了内存。我想知道是否有更好的方法来做到这一点?
谢谢大家的时间!
答案 0 :(得分:2)
(1)更常见的numpy成语是:
cube.data[cube.data < threshold_value] = 0.0
我认为应该在内存问题上留下一些印象,因为它不会计算整个新的浮点数组以进行分配。
但是,它确实需要为cube.data < threshold_value
创建一个数据大小的布尔数组,因此它可能仍然无法解决您的问题。
(2)如果你有一个可以切片的尺寸,例如一个具有几十个等级的典型Z维度,那么一个非常简单的性能改进可能是分段执行。 然后你可以将任务分开,例如,对于dd t,z,y,x的4d立方体: -
for i in range(nz):
part = cube.data[:, iz]
part[part < threshold_value] = 0.0
如果您的多维数据集已包含&#34; real&#34;而不是&#34;懒惰&#34;数据。
(3)然而,我想知道你的关键问题是否一次取出所有数据本身只是太大了?
这在Iris中是完全可能的,因为它使用延迟加载:因此,对&#34; cube.data&#34;的任何引用都是如此。将所有数据提取到真实的内存数组中,而例如只需保存立方体或计算统计数据就可以避免这种情况
因此,真正大的立方体的可用性在很大程度上取决于你最终对内容做了什么。
Iris现在对即将发布的2.0版本的文档提出了更为全面的解释:https://scitools-docs.github.io/iris/master/userguide/real_and_lazy_data.html
例如,在即将到来的iris v2中使用Dask,可以使用dask来有效地执行此操作。类似的东西:
data = cube.lazy_data()
data = da.where(data < threshold_value, data, 0.0)
zapped_cube = cube.copy(data=data)
这使得派生的多维数据集具有延迟数据计算。因为这可以在&#34; chunks&#34;当它到来时,它可以大大减少内存使用量。