какую команду numpy я могу использовать для многократного вычитания векторов с разными размерами? - PullRequest
0 голосов
/ 11 ноября 2018

я должен написать эту функцию: enter image description here в котором x - вектор с размерами [150,2], а c - [N, 2] (предположим, N = 20). Из каждого компонента xi (i = 1,2) я должен вычесть компоненты c таким образом ([x11-c11, x12-c12]) ... ([x11-cN1, x12-cN2]) для всех 150 образца. Я трансформировал их так, чтобы у меня были одинаковые размеры, и я могу вычесть их, но результатом функции должен быть вектор. Может быть Как я могу написать это в NumPy? Спасибо Хорошо, давайте предположим, что x = (5,2) и c = (3,2) enter image description here это то, что я получил, преобразовывая размеры двух массивов. проблема в том, что я должен сделать это, но с итерацией «для цикла», потому что функция exp должна дать мне в результате вектор. поэтому я должен получить вид матрицы, разделенной на N блоков.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Исходя из того, что я понимаю, проблема заключается в том, как вы вычисляете векторную норму, а не в вычитании. Используя ваш пример, но вычисляя exp(-||x-c||), попробуйте:

x = np.linspace(8,17,10).reshape((5,2))
c = np.linspace(1,6,6).reshape((3,2))
sub = np.linalg.norm(x[:,None] - c, axis=-1)
np.exp(-sub)

array([[  5.02000299e-05,   8.49325705e-04,   1.43695961e-02],
       [  2.96711024e-06,   5.02000299e-05,   8.49325705e-04],
        [  1.75373266e-07,   2.96711024e-06,   5.02000299e-05],
        [  1.03655678e-08,   1.75373266e-07,   2.96711024e-06],
        [  6.12664624e-10,   1.03655678e-08,   1.75373266e-07]])

np.exp(-sub).shape
(5, 3)

numpy.linalg.norm будет пытаться вернуть некоторую матричную норму по всем измерениям ее входных данных, если вы не укажете явно, какая ось представляет компоненты вектора.

0 голосов
/ 11 ноября 2018

Я понимаю, попробуйте, если это даст ожидаемый результат, но есть еще проблема, что результат имеет такую ​​же форму x:

import numpy as np

x = np.arange(10).reshape(5,2)
c = np.arange(6).reshape(3,2)

c_col_sum = np.sum(c, axis=0)

for (h,k), value in np.ndenumerate(x):
  x[h,k] = c.shape[0] * x[h,k] - c_col_sum[k]

Изначально x:

[[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]]

А c составляет:

[[0 1]
 [2 3]
 [4 5]]

После того, как функция x становится:

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