python - 将 Numpy 数组与新网格、过滤器和缩放对齐

标签 python numpy vector matplotlib zooming

我有一个值数组,例如 (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 中,我用 NaN 替换任何超过 10^3 的内容,但这会导致下一步出现问题。

将数据与新网格对齐后,我想对其进行重新采样,以便它由更少的点组成,在更多的空间上进行平均。我只是使用数组切片来获取每个第 n 个元素,但这似乎丢失了数据,所以我尝试使用 ndimage.interpolation.zoom(),但它只是用 NaN 填充数组。

我可以使用零代替 NaN,但我正在制作一个矢量图,并且使用零 basemap /matplotlib 的 quiver() 函数在所有零向量处放置一个点。对于 NaN,它不会尝试绘制这些点,这正是我想要的。我可以填充零,缩放,然后返回并将零翻转为 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
 .  .  .  .  .  .

实际上这些数组要大得多,并且点的间距都是相等的。

最佳答案

您可以尝试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. ]])

有许多插值类型可以尝试样条、线性(默认如上所示)、二次等。可以使用 intrepidaxis< 在第一个维度上进行插值 参数。对于二维情况,您可以再次使用插值: interp2d .

关于python - 将 Numpy 数组与新网格、过滤器和缩放对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23551394/

相关文章:

python - 如何将元组(子集)列表与列表项进行比较

python - NumPy - 计算直方图交集

c++ - 具有动态分配内存的 vector 无法删除最后一个

c++ - 如何获得 vector 中的最大值或最小值?

python - 如何训练或合并多个 .svm 并使用 dlib 检测多个类

python - 从 Google App Engine python 发送 iOS 推送通知

python - 如何在不创建实例的情况下选择性地访问类方法

python - 从数组中随机选择正负数据

matlab - 从 MATLAB 中的二进制向量 (0,1) 中选择前 n 个值

python - 从yahoo finance python一次下载多只股票