我主要使用 MATLAB,并且正在將我撰寫的一些代碼轉換為 Python。我遇到了一個問題,我有一個我稱之為 Omega 的布爾掩碼,當我將掩碼應用于不同的 m x n 矩陣時,我稱之為 X 和 MI 得到不同的物件。這是我的代碼
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Ω 和 MΩ 是不同的物件,從某種意義上說,XΩ 周圍有單括號,MΩ 周圍有雙括號。特別是列印命令列印出來
[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]]
我怎樣才能解決這個問題?
uj5u.com熱心網友回復:
M是 a np.matrix,它總是二維的(所以它有兩個維度)。如錯誤訊息所示,當分配給使用布爾掩碼掩碼的陣列時(這就是您正在做的),您只能使用 0 維或 1 維陣列。
相反,M首先轉換為陣列(正如@hpaulj 指出的那樣,這比使用asarray 更好ravel)
X[Omega] = M[Omega].A1
輸出:
>>> X
array([[ 1. , 1. , 2. ],
[ 0. , 1. , 1. ],
[ 1. , 2. , -0.00793191],
[ 1. , 0.42895392, 0.05560748]])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/448665.html
上一篇:可以在Python中將3Dnumpy陣列轉換為3D影像嗎?
下一篇:從密度分布中采樣隨機值
