在Python中插值3D数组 [英] Interpolate a 3D array in Python
本文介绍了在Python中插值3D数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个3D NumPy数组,如下所示:
I have a 3D NumPy array that looks like this:
arr = np.empty((4,4,5))
arr[:] = np.nan
arr[0] = 1
arr[3] = 4
arr
>>> [[[ 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1.]]
[[ nan nan nan nan nan]
[ nan nan nan nan nan]
[ nan nan nan nan nan]
[ nan nan nan nan nan]]
[[ nan nan nan nan nan]
[ nan nan nan nan nan]
[ nan nan nan nan nan]
[ nan nan nan nan nan]]
[[ 4. 4. 4. 4. 4.]
[ 4. 4. 4. 4. 4.]
[ 4. 4. 4. 4. 4.]
[ 4. 4. 4. 4. 4.]]]
我想沿axis=0
进行插值,以便获得以下信息:
I would like to interpolate along axis=0
so that I get the following:
>>> [[[ 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1.]]
[[ 2. 2. 2. 2. 2.]
[ 2. 2. 2. 2. 2.]
[ 2. 2. 2. 2. 2.]
[ 2. 2. 2. 2. 2.]]
[[ 3. 3. 3. 3. 3.]
[ 3. 3. 3. 3. 3.]
[ 3. 3. 3. 3. 3.]
[ 3. 3. 3. 3. 3.]]
[[ 4. 4. 4. 4. 4.]
[ 4. 4. 4. 4. 4.]
[ 4. 4. 4. 4. 4.]
[ 4. 4. 4. 4. 4.]]]
我一直在研究SciPy模块,似乎有一些方法可以在1D和2D阵列上执行此操作,但不是我需要的3D格式-尽管我可能错过了一些东西.
I've been looking at the SciPy module and there seems to be methods to do this on a 1D and 2D array, but not 3D like I need - though I may have missed something.
推荐答案
使用apply_along_axis
的解决方案:
import numpy as np
def pad(data):
good = np.isfinite(data)
interpolated = np.interp(np.arange(data.shape[0]),
np.flatnonzero(good),
data[good])
return interpolated
arr = np.arange(6, dtype=float).reshape((3,2))
arr[1, 1] = np.nan
print(arr)
new = np.apply_along_axis(pad, 0, arr)
print(arr)
print(new)
输出:
[[ 0. 1.]
[ 2. nan]
[ 4. 5.]]
[[ 0. 1.]
[ 2. nan]
[ 4. 5.]]
[[0. 1.]
[2. 3.]
[4. 5.]]
[edit]提出的第一个解决方案:
[edit] The first proposed solution:
import numpy as np
from scipy import interpolate
A = np.empty((4,4,5))
A[:] = np.nan
A[0] = 1
A[3] = 4
indexes = np.arange(A.shape[0])
good = np.isfinite(A).all(axis=(1, 2))
f = interpolate.interp1d(indexes[good], A[good],
bounds_error=False,
axis=0)
B = f(indexes)
print(B)
给予:
[[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
[[2. 2. 2. 2. 2.]
[2. 2. 2. 2. 2.]
[2. 2. 2. 2. 2.]
[2. 2. 2. 2. 2.]]
[[3. 3. 3. 3. 3.]
[3. 3. 3. 3. 3.]
[3. 3. 3. 3. 3.]
[3. 3. 3. 3. 3.]]
[[4. 4. 4. 4. 4.]
[4. 4. 4. 4. 4.]
[4. 4. 4. 4. 4.]
[4. 4. 4. 4. 4.]]]
仅当NaN都在同一切片上时,它才能很好地工作. NaN孤立的切片将被忽略.
It works well only if NaNs are all on same slice. The slice in which there is an isolated NaN will be ignored.
这篇关于在Python中插值3D数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文