【问题标题】:The fastest way to filter 3D Array into one 1D Array将 3D Array 过滤成一个 1D Array 的最快方法
【发布时间】:2021-09-16 06:56:33
【问题描述】:

我正在尝试按条件过滤多个 3D 数组,并将结果用作scipy.stats.binned_statistic_2d()np.histogram2d() 的输入。

这是一个简单的例子:

import numpy as np
import xarray as xr

array = xr.DataArray(np.random.randn(20, 2000, 3000))

stacked = array.stack(z=('dim_0', 'dim_1', 'dim_2'))
res = stacked.where(stacked>0, drop=True)

stack 步骤运行速度很慢:

16.9 s ± 1 s per loop (mean ± std. dev. of 7 runs, 1 loop each)

是否可以更快地获取res 并将dim_0dim_1dim_2 的值也保存为一维变量?

【问题讨论】:

    标签: python numpy scipy python-xarray


    【解决方案1】:

    你到底在这里用 xarray 做什么?

    由于 scipy 和 numpy 都适用于裸 numpy 数组,因此您可以简单地将数据作为 numpy 数组,并使用 ravel 获得相同内存的 1D 视图。

    不熟悉副本和视图的请参考numpy手册:https://numpy.org/devdocs/reference/arrays.ndarray.html?highlight=view

    这是闪电般的速度:

    ravelled = array.data.ravel()
    

    只要是一维数组,并且只需要布尔索引,numpy 就可以了:

    result = ravelled[ravelled > 0]
    

    【讨论】:

    • 我正在阅读 netcdf 文件,并且还想获取每个有效数据的暗淡值。是否也可以将 dims 保存为一维数组?
    • 我发现 pandas 的运行速度比 xarray 快得多......也许只是 to_dataframe() 解决了这个问题。
    猜你喜欢
    • 2021-02-13
    • 2021-04-16
    • 2021-12-28
    • 2020-12-11
    • 2016-01-16
    • 2013-04-21
    • 2010-10-12
    • 2021-05-05
    • 2021-11-01
    相关资源
    最近更新 更多