【发布时间】:2015-09-03 19:57:02
【问题描述】:
我有一个 (z, y, x) 和 shape=(92, 4800, 4800) 的 3D 数组,其中沿 axis 0 的每个值代表不同的时间点。在某些情况下,时域中的值获取失败,导致某些值成为np.NaN。在其他情况下,没有获取任何值,并且z 上的所有值都是np.NaN。
无论所有值都是np.NaN 的情况,使用线性插值沿axis 0 填充np.NaN 的最有效方法是什么?
这是我正在做的一个工作示例,它使用pandas 包装器到scipy.interpolate.interp1d。在原始数据集上,每个切片大约需要 2 秒,这意味着整个数组在 2.6 小时内处理完毕。减小大小的示例数据集大约需要 9.5 秒。
import numpy as np
import pandas as pd
# create example data, original is (92, 4800, 4800)
test_arr = np.random.randint(low=-10000, high=10000, size=(92, 480, 480))
test_arr[1:90:7, :, :] = -32768 # NaN fill value in original data
test_arr[:, 1:90:6, 1:90:8] = -32768
def interpolate_nan(arr, method="linear", limit=3):
"""return array interpolated along time-axis to fill missing values"""
result = np.zeros_like(arr, dtype=np.int16)
for i in range(arr.shape[1]):
# slice along y axis, interpolate with pandas wrapper to interp1d
line_stack = pd.DataFrame(data=arr[:,i,:], dtype=np.float32)
line_stack.replace(to_replace=-37268, value=np.NaN, inplace=True)
line_stack.interpolate(method=method, axis=0, inplace=True, limit=limit)
line_stack.replace(to_replace=np.NaN, value=-37268, inplace=True)
result[:, i, :] = line_stack.values.astype(np.int16)
return result
使用示例数据集在我的机器上的性能:
%timeit interpolate_nan(test_arr)
1 loops, best of 3: 9.51 s per loop
编辑:
我应该澄清一下代码正在产生我的预期结果。问题是 - 我怎样才能优化这个过程?
【问题讨论】:
-
在我的机器上运行示例大约需要 9.5 秒,但 test_arr 的形状是
(92, 480, 480)。如果将其增加到真实数据集(92, 4800, 4800)的大小并使用更多 NaN 传播它,则此方法需要更长的时间。
标签: python numpy pandas scipy interpolation