【发布时间】:2016-01-21 13:26:55
【问题描述】:
我是 Matlab 和 Python 的新手,并且正在将一些 Matlab 代码转换为它的 Python 等效代码。我面临的问题是从 sparse(i,j,v,m,n) 转换为 csr_matrix((data, (row_ind, col_ind)), [shape=(M, N)])。
在这段代码中,i、j 和 row_in、col_ind 将通过一个大小为 (124416, 1) 的索引数组 - idx 传递,而 v 和 data 将通过一个二维数组 - D22 大小为(290, 434)
Matlab:
...
H = 288;
W = 432;
N = (H+2)*(W+2);
mask = zeros(H+2, W+2);
mask(2:end-1, 2:end-1) = 1;
idx = find(mask==1);
>>>idx = [292, ..., 579, 582 ..., 869, ... , 125282, ..., 125569]
A = sparse(idx, idx+1, -D22(idx), N, N);
B = sparse(idx, idx-1, -D22(idx), N, N);
C = sparse(idx, idx+H+2, -D22(idx-1), N, N);
D = sparse(idx, idx-H-2, -D22(idx-1), N, N);
...
spy(A) 第一个条目是 m(293, 292) - (idx,idx+1),这正是我的预期。
spy(B) m(292, 293) - (idx,idx-1)。 我期待它是 m(291, 292),相信 idx-1 会返回一个数组 [291, ..., 578, 581 ..., 868, ... , 125281, ..., 125568]
spy(C) - m(582, 292) - (idx,idx+H+2)
spy(D) - m(292, 582) - (idx,idx-H-2)
因此,鉴于这是我理解索引顺序的方式,我以这种形式将代码翻译成 Python
Python:
...
H = 288
W = 432
N = (H+2) * (W+2)
mask = np.zeros([H+2, W+2])
mask[1:-1,1:-1] = 1
idx = np.nonzero(mask.transpose() == 1)
idx = np.vstack((idx[1], idx[0]))
idx = np.ravel_multi_index(idx, ((H+2),(W+2)), order='F').copy() # Linear Indexing as per Matlab
>>> idx
array([291, ..., 578, 581 ..., 868, ... , 125281, ..., 125568])
idx_ = np.unravel_index(idx, ((H+2),(W+2)), order='F') # *** Back to Linear Indexing
idx_ = np.column_stack((idx_[0], idx_[1])) # *** combine tuple of 2 arrays
idx_H_2 = np.unravel_index(idx-H-2, ((H+2),(W+2)), order='F')
idx_H_2 = np.column_stack((idx_H_2[0], idx_H_2[1]))
A = sp.csr_matrix((-D22[idx_[:,0], idx_[:,1]], (idx+1,idx)), shape = (N,N))
B = sp.csr_matrix((-D22[idx_[:,0], idx_[:,1]], (idx-1,idx)), shape = (N,N))
C = sp.csr_matrix((-D11[idx_[:,0], idx_[:,1]], (idx+H+2,idx)), shape = (N,N))
D = sp.csr_matrix((-D11[idx_H_2[:,0], idx_H_2[:,1]], (idx-H-2,idx)), shape = (N,N))
...
对于A,第一个入口是p(292, 291) - (idx+1,idx),由于Python是从零索引开始的,所以指的是Matlab m(293, 292) .
但是对于 B,第一个条目是 p(290, 291) - (idx-1,idx),这正是我所期望的(Matlab 中的等价物应该是 m(291, 292) ),但如前所述,Matlab 代码返回 (292, 293)。
C - p(581, 291) - (idx+H+2,idx)
D - p(1, 291) - (idx-H-2,idx)
谁能解释一下我可能理解不正确的地方,以及我应该如何修改我的 Python 代码以更准确地反映 Matlab 代码。
哦,还有一个 qns :)
Matlab:
A = A(idx,idx);
Python:
A = A[idx,:][:,idx]
是等价的吗?
非常感谢您的帮助和时间。
【问题讨论】:
标签: python arrays matlab scipy sparse-matrix