Нормализующие векторы, содержащиеся в массиве - PullRequest
0 голосов
/ 26 июня 2019

У меня есть массив, называемый X, где каждый элемент сам является 2d-вектором.Диагональ этого массива заполнена только нулевыми векторами.Теперь мне нужно нормализовать каждый вектор в этом массиве, не изменяя его структуру.

Сначала я попытался вычислить норму каждого вектора и поместить его в массив, называемый N. После этого я хотел разделитькаждый элемент X каждым элементом N. У меня возникли две проблемы:

1) Многие записи в N равны нулю, что, очевидно, является проблемой, когда я пытаюсь разделить их.

2) Формы массивов не совпадают, поэтому np.divide () работает не так, как ожидалось.

Кроме того, я не думаю, что будет хорошей идеей вычислять N следующим образом,потому что позже я хочу сделать то же самое с более чем двумя векторами.

import numpy as np

# Example array
X = np.array([[[0, 0], [1, -1]], [[-1, 1], [0, 0]]])
# Array containing the norms
N = np.vstack((np.linalg.norm(X[0], axis=1), np.linalg.norm(X[1], 
axis=1)))
R = np.divide(X, N)

Я хочу, чтобы вывод выглядел так:

R = np.array([[[0, 0], [0.70710678, -0.70710678]], [[-0.70710678, 0.70710678], [0, 0]]])

1 Ответ

1 голос
/ 26 июня 2019

Вам не нужно использовать sklearn. Просто определите функцию и затем используйте понимание списка:

Предполагая, что 0-е измерение X равно количеству имеющихся у вас 2D-массивов, используйте это:

import numpy as np

# Example array
X = np.array([[[0, 0], [1, -1]], [[-1, 1], [0, 0]]])

def stdmtx(X):
    X= X - X.mean(axis =1)[:, np.newaxis]
    X= X / X.std(axis= 1, ddof=1)[:, np.newaxis]
    return np.nan_to_num(X)

R = np.array([stdmtx(X[i,:,:]) for i in range(X.shape[0])])

Требуемый выход R:

array([[[ 0.        ,  0.        ],
        [ 0.70710678, -0.70710678]],

       [[-0.70710678,  0.70710678],
        [ 0.        ,  0.        ]]])
...