numpy 在多维数组中用平均值或插值填充nan值

pkbketx9  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(92)

我有一个很大的多维数组here,它有很多nan值。
我想计算沿第一轴(5124)的平均值,或者插值。

import numpy as np

data = np.load('data.npy')

mean = np.nanmean(data, axis=1)

现在,mean具有形状:5124, 112data5124, 112, 112,所以我尝试:

data[np.any(np.isnan(data))][-1, :, :, -1] = mean

但是数据仍然充满NAN值。
我不知道如何将平均值填入数据数组。
我尝试了一些插值方法,但非常非常慢,内存消耗,所以我不知道是否有更好的方法来填补nan值。

fnatzsnv

fnatzsnv1#

有点慢,但你可以试试:

data2 = np.nan_to_num(data) + np.isnan(data) * mean[:, None]

正如@Stef所建议的,您可以使用bottleneck来加速此过程:

# pip install bottleneck
import bottleneck as bn

mean = bn.nanmean(data, axis=1)
data2 = bn.replace(data, np.nan, 0) + np.isnan(data) * mean[:, None]

输出:

>>> data2
array([[[277.02652, 276.253  , 276.36276, ..., 272.2693 , 271.90436,
         271.64706],
        [277.02652, 276.253  , 276.36276, ..., 272.2693 , 271.90436,
         271.64706],
        [277.02652, 276.253  , 276.36276, ..., 272.2693 , 271.90436,
         271.64706],
        ...,
        [277.12585, 275.2982 , 275.56424, ..., 272.2693 , 271.90436,
         271.64706],
        [277.12585, 275.2982 , 275.56424, ..., 272.2693 , 271.90436,
         271.64706],
        [275.11438, 274.27878, 275.17032, ..., 272.2693 , 271.90436,
         271.64706]],

       [[277.4939 , 277.1011 , 277.1529 , ..., 271.71024, 271.51944,
         271.41312],
        [277.4939 , 277.1011 , 277.1529 , ..., 271.71024, 271.51944,
         271.41312],
        [277.4939 , 277.1011 , 277.1529 , ..., 271.71024, 271.51944,
         271.41312],
        ...,
        [277.50073, 276.22455, 276.3818 , ..., 271.71024, 271.51944,
         271.41312],
        [277.50073, 276.22455, 276.3818 , ..., 271.71024, 271.51944,
         271.41312],
        [275.67734, 275.02505, 275.5379 , ..., 271.71024, 271.51944,
         271.41312]],

       [[280.99646, 280.2319 , 280.23727, ..., 272.60663, 272.44424,
         272.37073],
        [280.99646, 280.2319 , 280.23727, ..., 272.60663, 272.44424,
         272.37073],
        [280.99646, 280.2319 , 280.23727, ..., 272.60663, 272.44424,
         272.37073],
        ...,
        [281.111  , 279.33786, 279.4811 , ..., 272.60663, 272.44424,
         272.37073],
        [281.111  , 279.33786, 279.4811 , ..., 272.60663, 272.44424,
         272.37073],
        [279.05643, 277.9778 , 278.5424 , ..., 272.60663, 272.44424,
         272.37073]],

       ...,

       [[299.3109 , 298.8816 , 299.19708, ..., 291.41086, 290.98898,
         290.52472],
        [299.3109 , 298.8816 , 299.19708, ..., 291.41086, 290.98898,
         290.52472],
        [299.3109 , 298.8816 , 299.19708, ..., 291.41086, 290.98898,
         290.52472],
        ...,
        [299.31546, 298.22787, 298.71487, ..., 291.41086, 290.98898,
         290.52472],
        [299.31546, 298.22787, 298.71487, ..., 291.41086, 290.98898,
         290.52472],
        [297.89618, 297.6253 , 298.5444 , ..., 291.41086, 290.98898,
         290.52472]],

       [[298.63446, 298.0783 , 298.38287, ..., 291.76425, 291.33102,
         290.88724],
        [298.63446, 298.0783 , 298.38287, ..., 291.76425, 291.33102,
         290.88724],
        [298.63446, 298.0783 , 298.38287, ..., 291.76425, 291.33102,
         290.88724],
        ...,
        [298.59354, 297.55087, 298.04398, ..., 291.76425, 291.33102,
         290.88724],
        [298.59354, 297.55087, 298.04398, ..., 291.76425, 291.33102,
         290.88724],
        [297.37015, 297.07132, 297.82864, ..., 291.76425, 291.33102,
         290.88724]],

       [[297.76532, 297.54745, 297.9761 , ..., 292.29636, 291.87845,
         291.44046],
        [297.76532, 297.54745, 297.9761 , ..., 292.29636, 291.87845,
         291.44046],
        [297.76532, 297.54745, 297.9761 , ..., 292.29636, 291.87845,
         291.44046],
        ...,
        [297.75772, 296.86356, 297.46335, ..., 292.29636, 291.87845,
         291.44046],
        [297.75772, 296.86356, 297.46335, ..., 292.29636, 291.87845,
         291.44046],
        [296.43677, 296.22397, 297.20667, ..., 292.29636, 291.87845,
         291.44046]]], dtype=float32)

相关问题