NumPy Python 或 SciPy 中 Wolfram Mathematica 的模拟函数

Analogue function of Wolfram Mathematica in Python in NumPy or SciPy

我正在将一些用 Wolfram Mathematica 编写的代码重写为 Python。而且,在某些时候我需要一个函数的模拟 ArrayResample[array,dspec]。您可能知道任何包(NumPy 或 SciPy)中的函数?

您可以使用 scipy.ndimage.map_coordinates。 这是 ArrayResample examplesmap_coordinate 等价物:

In [51]: import scipy.ndimage as ndimage

In [67]: ndimage.map_coordinates(np.array([1,2,3,4,5], dtype=float), [np.linspace(0,4,9)], order=1)
Out[67]: array([1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. ])

In [68]: ndimage.map_coordinates(np.array([1,2,3,4,5], dtype=float), [np.linspace(0,4,3)], order=1)
Out[68]: array([1., 3., 5.])

In [65]: ndimage.map_coordinates(np.array([(1,2,3), (2,3,4), (3,4,5)], dtype=float), np.meshgrid(np.linspace(0,2,6), np.linspace(0,2,6), indexing='ij'), order=1)
Out[65]: 
array([[1. , 1.4, 1.8, 2.2, 2.6, 3. ],
       [1.4, 1.8, 2.2, 2.6, 3. , 3.4],
       [1.8, 2.2, 2.6, 3. , 3.4, 3.8],
       [2.2, 2.6, 3. , 3.4, 3.8, 4.2],
       [2.6, 3. , 3.4, 3.8, 4.2, 4.6],
       [3. , 3.4, 3.8, 4.2, 4.6, 5. ]])

ndimage.map_coordinates 的第一个参数主要是不言自明的。 与 Mathematica 的 ArrayResample 函数不同,第二个参数是您希望对数组重新采样的 坐标

调用ndimage.map_coordinates(input, coordinates)时, 如果 input 是一个 N 维数组,那么 coordinates 应该是 N 个数组的序列——每个轴一个数组。


如果 A 是形状为 (h, w) 的数组,并且您希望将 A 重新采样为形状为 (H, W) 的新数组, 那么你会使用

ndimage.map_coordinates(A, np.meshgrid(np.linspace(0,h-1,H), np.linspace(0,w-1,W), 
                                       indexing='ij'), order=1)

np.linspace is used to generate equally spaced values between 0 and h-1 (and 0 and w-1). These values are 1D coordinates. np.meshgrid用于将一维坐标组合成二维网格。

这可能有点非技术性,但在我看来(在看到 Wolfram 中的示例之后),我有一半相信 np.linspace 与 ArrayResample 做的完全相同。

所以我的意思是:

In Wolfram: 
ArrayResample[{1, 2, 3, 4, 5}, 9]
gives:

与 numpy 相似,用于行空间:

np.linspace(1,5,num=9)
gives:
array([1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. ])

还有,对于:

np.linspace(1,5,num=3)
it gives:
array([1., 3., 5.])

这是您要找的东西还是比这复杂得多?