Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
稀疏矩阵:Matlab到Python的代码转换_Python_Python 2.7_Matlab_Numpy_Sparse Matrix - Fatal编程技术网

稀疏矩阵:Matlab到Python的代码转换

稀疏矩阵:Matlab到Python的代码转换,python,python-2.7,matlab,numpy,sparse-matrix,Python,Python 2.7,Matlab,Numpy,Sparse Matrix,如何将其从Matlab转换为Python: A = sparse(row_idx, col_idx, values, len, s1 * s2); scales = zeros(size(A, 1), 1); scales(sub2ind([s1 s2], floor(frames(2, :)), floor(frames(1, :)))) = ... frames(3, :); eq = A \ scales; 我的尝试是: from scipy.sparse import csr

如何将其从Matlab转换为Python:

A = sparse(row_idx, col_idx, values, len, s1 * s2);
scales = zeros(size(A, 1), 1);
scales(sub2ind([s1 s2], floor(frames(2, :)), floor(frames(1, :)))) = ...
    frames(3, :);
eq = A \ scales;

我的尝试是:

from scipy.sparse import csr_matrix # to replace sparse matrix
import numpy as np # to replace \ with np.linalg.lstsq
A = csr_matrix((values, (row_idx , col_idx )), shape=(length, width * height))
scales = np.zeros((A.shape[0]));
for kp in kps:
   x,y = int(kp.pt[0]), int(kp.pt[1])
   scales[y][x] = int(kp.size) # error
   scales[y*x] = int(kp.size) # again, error:(
...
eq = np.linalg.lstsq(A, scales)

我更改了变量名称(
leng->length
(s1,s2)->(width,height)
),并访问keypoint类中的
size
成员,而不是matlab中的
frames[3]
,但这些都是微小的更改

我不确定的是,对于
scales
创建和索引访问,我到底应该做些什么。我似乎错过了什么,但找不到什么

我得到
TypeError:'numpy.float64'对象不支持项分配
,这一点我并不感到惊讶,因为
缩放
是一维数组,我不应该使用
[]
访问它

但是,将其更改为
scales[y*x]=int(kp.size)
会引发以下问题:
linalgeror:0维数组给定。数组必须是二维的


据我所知,Matlab代码采用一个稀疏矩阵,创建一个列向量(
缩放
),然后填充该列向量,以使来自
(即Python代码中的每个帧(
关键点
)的任何索引
(x,y)
),并在所述索引处插入一个新值(值是
frame(3)
size
)。看起来很简单,但我不知道哪里出了问题


非常感谢您的帮助:)

问题在于
np.linalg.lstsqr
是一个numpy函数,不理解稀疏矩阵。如果他们将任务委托给方法,Numpy函数就可以工作,但如果他们首先尝试将稀疏矩阵转换为数组,则无法工作

举个简单的例子:

In [345]: R = np.arange(1,6)
In [346]: M = sparse.csr_matrix(([1,1,1],([0,2,4],[0,1,2])),shape=(5,3))
In [347]: M.A
Out[347]: 
array([[1, 0, 0],
       [0, 0, 0],
       [0, 1, 0],
       [0, 0, 0],
       [0, 0, 1]], dtype=int64)

In [348]: np.linalg.lstsq(M,R, rcond=None)
   ...
-> 1977     _assertRank2(a, b)
   1978     _assertNoEmpty2d(a, b)  # TODO: relax this constraint
   1979     m  = a.shape[0]

/usr/local/lib/python3.6/dist-packages/numpy/linalg/linalg.py in _assertRank2(*arrays)
    193         if a.ndim != 2:
  ....
LinAlgError: 0-dimensional array given. Array must be two-dimensional
它认为
M
的维数是0-d,而不是2-d。这是因为,在
np.array
(或'asarray')中包装稀疏矩阵时,会生成0d对象数组:

In [351]: np.array(M)
Out[351]: 
array(<5x3 sparse matrix of type '<class 'numpy.int64'>'
    with 3 stored elements in Compressed Sparse Row format>, dtype=object)
In [352]: _.shape
Out[352]: ()
在MATLAB中,稀疏矩阵被集成到主代码中。在
numpy
中,它们位于单独的
scipy.sparse
包中。稀疏矩阵不是
np.ndarray
的子类

有一个稀疏线性代数子包:

In [355]: from scipy.sparse import linalg as spla
In [356]: spla.lsqr(M, R)
Out[356]: 
(array([1., 3., 5.]),
 2,
 1,
 4.47213595499958,
 4.47213595499958,
 1.0,
 1.0,
 4.082652109348718e-16,
 5.916079783099617,
 array([0., 0., 0.]))

np.zeros((n,1))
创建列向量/数组。或者稍后使用
重塑
缩放[:,np.newaxis]
添加第二个维度。我不确定这种情况下的维度应该是什么。matlab代码不是创建了一个列向量吗,这正是我正在做的吗?np.zeros(n)是1d,不是列向量。你说的是我只需要加上`,1`?
In [355]: from scipy.sparse import linalg as spla
In [356]: spla.lsqr(M, R)
Out[356]: 
(array([1., 3., 5.]),
 2,
 1,
 4.47213595499958,
 4.47213595499958,
 1.0,
 1.0,
 4.082652109348718e-16,
 5.916079783099617,
 array([0., 0., 0.]))