Выборка массива numpy с индексами с плавающей точкой (аналог Pytorch grid_sample) - PullRequest
0 голосов
/ 03 мая 2020

Есть ли способ выборки массива numpy с индексами с плавающей запятой, используя билинейную интерполяцию для получения промежуточных значений? Например, учитывая массив 1D:

arr=np.array([0,1])

Я бы хотел, чтобы arr[0.5] вернул 0.5, поскольку этот индекс лежит в диапазоне от 0 до 1. Для 2D-примера:

arr=np.array([[0,1],[2,3]])

arr[0.5, 0.5] должен вернуть 1.5. В pytorch эта функциональность обеспечивается torch.nn.grid_sample, я хотел бы сравнить производительность с этим в numpy для моего приложения.

1 Ответ

0 голосов
/ 03 мая 2020

Один из способов - подделать его с помощью интерполяции по области индексов матрицы до значения вашего массива (как в функции, принимающей два аргумента и возвращающей интерполяцию вашего массива):

>>> from scipy.interpolate import interp2d
>>> Y, X = np.meshgrid(range(arr.shape[0]), range(arr.shape[1]))
>>> f = interp2d(X, Y, arr, kind='linear')
>>> print(f(0, 0), f(0, 1), f(1, 0), f(1, 1),f(0.5, 0.5))
[0.] [1.] [2.] [3.] [1.5]

shape[0] - это строки, которые являются нашей y осью, и такие же для shape[1] (столбцы) и x . Вы можете предпочесть установить bounds_error=True в интерполяции, в противном случае f(-1, 2) вернет что-то из массива (или fill_value, если вы его установите). Другой вариант - fill_value=np.nan, который часто имеет смысл.

Примечание f - это , а не массив , и поэтому такие вещи, как f*2, являются ошибками. Если вы хотите что-то подобное, вам, вероятно, придется реализовать это самостоятельно. Я не думаю, что в numpy есть что-то подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...