Аналоговая функция Wolfram Mathematica в Python в NumPy или SciPy - PullRequest
0 голосов
/ 04 января 2019

Я переписываю некоторый код, написанный в Wolfram Mathematica для Python. И в какой-то момент мне понадобился аналог функции ArrayResample[array,dspec]. Может быть, вы знаете функцию из любого пакета (NumPy или SciPy)?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Это может быть немного нетехническим способом, но, по моему мнению (после просмотра примеров в Wolfram), я наполовину убежден, что np.linspace делает то же самое, что вы хотите с ArrayResample.

Итак, что я имею в виду:

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

enter image description here

И похож, 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.])

Это то, что вы ищете, или это намного сложнее, чем это?

0 голосов
/ 04 января 2019

Вы можете использовать scipy.ndimage.map_coordinates. Вот map_coordinate эквивалентов примеров ArrayResample :

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 в основном не требует пояснений. В отличие от функции ArrayResample в Mathematica, вторым аргументом являются координаты , при которых вы хотите пересчитать массив.

При звонке 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 используется для генерации одинаково распределенных значений между 0 и h-10 и w-1). Эти значения являются одномерными координатами. np.meshgrid используется для объединения 1D координат в 2D сетку.

...