我有一个名为X的数组,其中每个元素本身都是2d向量。该数组的对角线仅填充零向量。 现在,我需要规范化此数组中的每个向量,而无需更改其结构。
首先,我尝试计算每个向量的范数并将其放入一个称为N的数组中。之后,我想将X的每个元素除以N的每个元素。 我发生了两个问题:
1)N的许多条目为零,当我尝试将它们除时,这显然是个问题。
2)数组的形状不匹配,因此np.divide()不能按预期工作。
除了我不认为之外,这样计算N是个好主意,因为稍后我希望能够对两个以上的向量进行相同的处理。
"A1"
"A2toB (B1 C1)"
"A2toB B2"
"A3"
我希望输出看起来像这样:
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)
答案 0 :(得分:1)
您不需要使用sklearn
。只需定义一个函数,然后使用列表推导即可:
假设X的第0维等于您拥有的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. ]]])