scipy 如何使用插值法将任意Numpy NDArray的大小调整为新形状

r7knjye2  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(130)

备注:

这与其说是一个问题,不如说是一个贡献,因为我会回答我自己的问题,不过,我仍然对社会如何解决这个问题感兴趣,所以请随便回答。

故事:

因此,当我在Python中使用QT(即PySide6)和它的Volume渲染功能时,我注意到在设置数据数组时出现了一些问题。长话短说:我不知道(如果在QT文档中有说明的话)提供的纹理必须是每个维度都是2的幂的形状。
因此,我想将数组重新缩放为满足此条件的形状。
使用numpy计算此形状非常简单:
new_shape = numpy.power(2, numpy.ceil(numpy.log2(old_shape))).astype(int)
现在剩下的唯一问题是将形状为old_shape的数组重新缩放为形状为new_shape的新数组,并正确地插入值。
由于我通常只对某种通用的方法感兴趣(谁知道这对谁有好处,谁知道将来对谁有好处),下面的问题确实出现了:

问题

如何通过适当的插值将old_shape形状的任意Numpy NDArray调整为new shape形状的Numpy NDArray?
我试着用Scipy RegularGridInterpolator来重新缩放我的数组,它确实起作用了。

o2rvlv0m

o2rvlv0m1#

我使用scipy的RegularGridInterpolator对数组进行插值。
其他插值器也应该可以工作。

def resample_array_to_shape(array: np.array, new_shape, method="linear"):
    # generate points for each entry in the array
    entries = [np.arange(s) for s in array.shape]

    # the value for each point corresponds to its value in the original array
    interp = RegularGridInterpolator(entries, array, method=method)

    # new entries
    new_entries = [np.linspace(0, array.shape[i] - 1, new_shape[i]) for i in range(len(array.shape))]

    # use 'ij' indexing to avoid swapping axes
    new_grid = np.meshgrid(*new_entries, indexing='ij')

    # interpolate and return
    return interp(tuple(new_grid)).astype(array.dtype)

相关问题