Умножение Python Matrix для создания сетки - PullRequest
0 голосов
/ 27 июня 2019

Существует ли какой-либо простой способ / команда в Python для двух (или трех) умножений матриц для получения ядра продукта, например, расширяется для сетки? Я имею в виду очки должны быть оценены для каждой комбинации сетки

У меня есть два решения, однако первое сделано с использованием циклов (в моем случае это неприемлемо), а другое выполняет изменение формы ввода перед умножением (жестко закодировано и работает для продукта из 2 ядер и нуждается в корректировках, если будет использоваться для 3,4 и др. Ядра).

Первое решение:

for xi, xg in enumerate(xgrid):
    for yi, yg in enumerate(ygrid):
    kde[xi, yi] = 1 / ndata * np.sum(kernel1(xg) * kernel2(yg))

Где kernel1 (xg) * kernel2 (yg) - это, например, вектор (1, 10000), где точки данных оцениваются в каждой точке сетки xg и yg. Таким образом, мы на самом деле строим продукт расчета сетки шаг за шагом.

Второе решение, где «fullkernel» уже является объектом оценки данных в сетке:

kde = np.zeros(shape=(98, 98)) # 98 is length of grid
X_out = np.repeat(fullkernel[0], len(fullkernel[0]), axis=0)
Y_out = np.tile(fullkernel[1], (len(fullkernel[1]), 1))
testing = 1 / len(fullkernel[0]) * np.sum(X_out * Y_out, axis=1)
f = np.reshape(testing.T, kde.shape)

форма полного ядра - (2, 98, 9999), где 2 - это два разных набора данных, 98 точек сетки и 9999 точек данных.

Итак, в конце мне нужна матрица размера (9604, 9999), которая похожа на X_out * Y_out в приведенном выше примере, но без изменения формы и разбиения исходных данных. Есть ли способ получить эту матрицу с помощью какой-либо команды, используя fullkernel [0] и fullkernel [1] только без каких-либо дополнительных приготовлений?

1 Ответ

0 голосов
/ 27 июня 2019

Я нашел решение этой проблемы методом проб и ошибок. Если это помогает другим:

res = 1 / len(fullkernel[0][0]) * np.sum(fullkernel[0][:, None, :] * fullkernel[1], axis=2)

Результат умножения - куб 98 * 98 * 9999. Создание еще одного измерения является ключом для того, чтобы умножение было «сетчатым», например исправление одной точки сетки xg и прохождение через все остальные точки сетки y, а затем повторение всего этого для других точек сетки x.

И после суммирования по столбцам res имеет форму 98 * 98, что мне и нужно. Потребовалось 0,7 секунды, чтобы запустить 2 набора данных по 10000 точек и 2 сетки по len = 98 каждый. На цикл ушло 2,7 секунды. Плитка / повторный подход 1,6 секунды.

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