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 examples 的 map_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.])
这是您要找的东西还是比这复杂得多?
我正在将一些用 Wolfram Mathematica 编写的代码重写为 Python。而且,在某些时候我需要一个函数的模拟 ArrayResample[array,dspec]
。您可能知道任何包(NumPy 或 SciPy)中的函数?
您可以使用 scipy.ndimage.map_coordinates
。
这是 ArrayResample examples 的 map_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.])
这是您要找的东西还是比这复杂得多?