我有一个值数组,比如说(7,5),我想把它映射到一个形状数组(7,6)。数据均等间隔,因此,例如我们有
. u . u . u . u . u .
. u . u . u . u . u .
. u . u . u . u . u .
. u . u . u . u . u .
. u . u . u . u . u .
. u . u . u . u . u .
. u . u . u . u . u .
其中' u是当前数据,点是我想从中取样的地方。编辑:例如,矢量数据可能看起来像
3.0 4.0 3.0 2.0 2.0
2.0 3.0 3.0 2.0 3.0
2.0 3.0 3.0 2.0 2.0
etc.
我希望它最终成为像
这样的7x6阵列3.0 3.5 3.5 2.5 2.0 2.0
2.0 2.5 3.0 2.5 2.5 3.0
2.0 2.5 3.0 2.5 2.0 2.0
etc.
所以点是我想要对数据进行采样的纬度/长度,而“我”是我有数据的点,它们位于每个纬度/长点的中间位置。行。
现在,我正在使用ndimage.generic_filter在数据上传递1x2过滤器,并在同一行中平均两个相邻的' u然后将最右边的列切掉原始数组并使用scipy.hstack将其添加到generic_filter导致的数组一侧。我觉得有更好的方法来做到这一点。
此外,这些数组的点数没有填充9.99999993e + 36的数据。在我的generic_filter中,我用NaN替换10 ^ 3以上的任何东西,但这会导致下一步的问题。
将数据与新网格对齐后,我想对其进行重新取样,使其包含更少的点,平均更多空间。我只是使用一个数组切片来获取每个第n个元素,但这似乎是我丢失数据,所以我尝试使用ndimage.interpolation.zoom(),但它只是用NaN填充数组。
我可以使用零而不是NaN,但我制作了一个矢量图并使用零底图/ matplotlib的quiver()函数在所有零矢量上放置一个点。使用NaNs并不会尝试绘制这些点,这就是我想要的。我可以填充零,缩放,然后返回并将零翻转为NaN,当我这样做时它不会将零保留为零,它会用非常小的值填充它们。在这种情况下,没有数据的点是陆地,因此没有洋流,我希望它们保持为零或NaN。
我应该注意到我有另一个可能是形状(6,6)的数组,它是矢量的v分量,我希望它具有形状(7,6)。它的结构与u数组的结构相同,只是我有数据的点在列而不是行中,比如
. . . . . .
v v v v v v
. . . . . .
v v v v v v
. . . . . .
v v v v v v
. . . . . .
v v v v v v
. . . . . .
v v v v v v
. . . . . .
v v v v v v
. . . . . .
实际上这些阵列要大得多,并且点都是等距的。
答案 0 :(得分:1)
您可以尝试 interpolate,但其他地方可能有更好的选择:
>>> from scipy.interpolate import interp1d
>>> arr
array([[ 3., 4., 3., 2., 2.],
[ 2., 3., 3., 2., 3.],
[ 2., 3., 3., 2., 2.]])
>>> func = interp1d(np.linspace(0, 1, arr.shape[1]), arr)
>>> func(np.linspace(0, 1, arr.shape[1]+1))
array([[ 3. , 3.8, 3.4, 2.6, 2. , 2. ],
[ 2. , 2.8, 3. , 2.6, 2.2, 3. ],
[ 2. , 2.8, 3. , 2.6, 2. , 2. ]])
这很容易扩展到更大的形状。
>>> func(np.linspace(0, 1, arr.shape[1]+4))
array([[ 3. , 3.5, 4. , 3.5, 3. , 2.5, 2. , 2. , 2. ],
[ 2. , 2.5, 3. , 3. , 3. , 2.5, 2. , 2.5, 3. ],
[ 2. , 2.5, 3. , 3. , 3. , 2.5, 2. , 2. , 2. ]])
有许多插值类型可以尝试样条线性,线性(默认如上所示),二次等。可以使用intrepid
' s axis
在第一维上进行插值。论点。对于二维情况,您可以再次使用插值:interp2d。