我有一个值数组,比如(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.
所以点是我想要采样数据的经纬点,‘u’是我拥有数据的点,它们位于每一行中每个经纬点的中间。
现在,我使用ndimage.generic_filter对数据进行1x2过滤,取同一行中相邻的两个‘u’的平均值,然后从原始数组中切出最右边的一列,并使用scipy.hstack将其添加到generic_filter生成的数组的一侧,我觉得有更好的方法可以做到这一点。
此外,这些数组具有用9.99999993e+36填充没有数据的点。在我的generic_filter中,我将所有大于10^3的值都替换为NaNs,但这会导致下一步出现问题。
在将数据对齐到新的网格之后,我想对其进行重新采样,以便它由更少的点组成,在更多的空间中平均。我只是使用数组切片来获取每个第n个元素,但这似乎丢失了数据,所以我尝试使用ndimage.interpolation.zoom(),但它只是用NaNs填充数组。
我可以使用0而不是NaNs,但是我正在制作一个矢量图,并且使用zeros basemap/matplotlib的quiver()函数在所有的零矢量上放置一个点。对于NaNs,它不会尝试绘制这些点,这正是我想要的。我可以用零填充,缩放,然后返回并将零翻转为NaNs,当我这样做时,它不会将零保留为零,它会用非常小的值填充它们。在这种情况下,没有数据的点是陆上的,所以没有洋流,我希望它们保持为零或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
. . . . . .
实际上,这些数组要大得多,并且这些点都是等间距的。
发布于 2014-05-09 02:01:18
您可以尝试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
的axis
参数在第一维上进行插值。对于2-D情况,您可以再次使用interpolate:interp2d。
https://stackoverflow.com/questions/23551394
复制