将掩码应用于矩阵会在 numpy 中给出不同的对象
applying a mask to matrices gives different objects in numpy
我主要使用 MATLAB,我正在将我编写的一些代码转换为 Python。我 运行 遇到一个问题,我有一个布尔掩码,我称之为 Omega,当我将掩码应用于不同的 m x n 矩阵(我称之为 X 和 M)时,我得到不同的对象。这是我的代码
import numpy as np
from numpy import linalg as LA
m = 4
n = 3
r = 2
A = np.matrix('1 0; 0 1; 1 1;1 2')
B = np.matrix('1 1 2; 0 1 1')
M = A @ B
Omega = np.matrix('1 1 1;1 1 1;1 1 0;1 0 0',dtype=bool) #mask
X = np.copy(M)
X[~Omega] = 0
U, S, Vh = LA.svd(X) #singular value decompostion of X
Sigma = np.zeros((m,n))
np.fill_diagonal(Sigma,S)
X = U[:,0:r] @ Sigma[0:r,0:r] @ Vh[0:r,:]
print(X[Omega])
print(M[Omega])
X[Omega] = M[Omega]
我在最后一行收到错误“NumPy 布尔数组索引分配需要 0 或 1 维输入,输入有 2 维”。然而,问题似乎是 X[Omega] 和 M[Omega] 是不同的对象,因为 X[Omega] 周围有单括号,M[Omega] 周围有双括号。特别是,打印命令打印出
[0.78935751 1.12034437 2.01560085 0.4845614 0.72316014 0.96411184 1.10709648 1.93881358 0.24918864]
[[1 1 2 0 1 1 1 2 1]]
我该如何解决这个问题?
M
是一个 np.matrix
,它总是二维的(所以它有两个维度)。如错误消息所示,在分配给用布尔掩码屏蔽的数组时(这就是您正在做的),您只能使用 0 或 1 维数组。
相反,首先将 M
转换为数组(这比使用 asarray
+ ravel
更好)
X[Omega] = M[Omega].A1
输出:
>>> X
array([[ 1. , 1. , 2. ],
[ 0. , 1. , 1. ],
[ 1. , 2. , -0.00793191],
[ 1. , 0.42895392, 0.05560748]])
我主要使用 MATLAB,我正在将我编写的一些代码转换为 Python。我 运行 遇到一个问题,我有一个布尔掩码,我称之为 Omega,当我将掩码应用于不同的 m x n 矩阵(我称之为 X 和 M)时,我得到不同的对象。这是我的代码
import numpy as np
from numpy import linalg as LA
m = 4
n = 3
r = 2
A = np.matrix('1 0; 0 1; 1 1;1 2')
B = np.matrix('1 1 2; 0 1 1')
M = A @ B
Omega = np.matrix('1 1 1;1 1 1;1 1 0;1 0 0',dtype=bool) #mask
X = np.copy(M)
X[~Omega] = 0
U, S, Vh = LA.svd(X) #singular value decompostion of X
Sigma = np.zeros((m,n))
np.fill_diagonal(Sigma,S)
X = U[:,0:r] @ Sigma[0:r,0:r] @ Vh[0:r,:]
print(X[Omega])
print(M[Omega])
X[Omega] = M[Omega]
我在最后一行收到错误“NumPy 布尔数组索引分配需要 0 或 1 维输入,输入有 2 维”。然而,问题似乎是 X[Omega] 和 M[Omega] 是不同的对象,因为 X[Omega] 周围有单括号,M[Omega] 周围有双括号。特别是,打印命令打印出
[0.78935751 1.12034437 2.01560085 0.4845614 0.72316014 0.96411184 1.10709648 1.93881358 0.24918864]
[[1 1 2 0 1 1 1 2 1]]
我该如何解决这个问题?
M
是一个 np.matrix
,它总是二维的(所以它有两个维度)。如错误消息所示,在分配给用布尔掩码屏蔽的数组时(这就是您正在做的),您只能使用 0 或 1 维数组。
相反,首先将 M
转换为数组(这比使用 asarray
+ ravel
更好)
X[Omega] = M[Omega].A1
输出:
>>> X
array([[ 1. , 1. , 2. ],
[ 0. , 1. , 1. ],
[ 1. , 2. , -0.00793191],
[ 1. , 0.42895392, 0.05560748]])