Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.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
Python R'之间的差异;s和Numpy';s-QR分解_Python_R_Numpy - Fatal编程技术网

Python R'之间的差异;s和Numpy';s-QR分解

Python R'之间的差异;s和Numpy';s-QR分解,python,r,numpy,Python,R,Numpy,我正在研究一个大型的R(v3.6.0)代码库,并试图了解它在做什么。为此,我使用Numpy(v1.14.3)将一些R代码翻译成Python(v3.6.5)。我有一段R代码,似乎工作得很好: > v<-c(1,1,1,1) > qrout<-qr(v) > qr.Q(qrout) [,1] [1,] -0.5 [2,] -0.5 [3,] -0.5 [4,] -0.5 > qr.R(qrout) [,1] [1,] -2 >v qrou

我正在研究一个大型的R(v3.6.0)代码库,并试图了解它在做什么。为此,我使用Numpy(v1.14.3)将一些R代码翻译成Python(v3.6.5)。我有一段R代码,似乎工作得很好:

> v<-c(1,1,1,1)
> qrout<-qr(v)
> qr.Q(qrout)
     [,1]
[1,] -0.5
[2,] -0.5
[3,] -0.5
[4,] -0.5
> qr.R(qrout)
     [,1]
[1,]   -2
>v qrout qr.Q(qrout)
[,1]
[1,] -0.5
[2,] -0.5
[3,] -0.5
[4,] -0.5
>qr.R(qrout)
[,1]
[1,]   -2
Python等价物是精细:

>>> import numpy as np
>>> v=np.ones(4)
>>> v
array([1., 1., 1., 1.])
>>> np.linalg.qr(v)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/python/3.6.5/lib/python3.6/site-packages/numpy/linalg/linalg.py", line 753, in qr
    _assertRank2(a)
  File "/opt/python/3.6.5/lib/python3.6/site-packages/numpy/linalg/linalg.py", line 195, in _assertRank2
    'two-dimensional' % a.ndim)
numpy.linalg.linalg.LinAlgError: 1-dimensional array given. Array must be two-dimensional
>>将numpy作为np导入
>>>v=np.一(4)
>>>五
数组([1,1,1,1.]))
>>>np.linalg.qr(五)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/opt/python/3.6.5/lib/python3.6/site packages/numpy/linalg/linalg.py”,第753行,qr格式
_资产等级2(a)
文件“/opt/python/3.6.5/lib/python3.6/site-packages/numpy/linalg/linalg.py”,第195行,位于资产重组k2中
'二维“%a.ndim”)
numpy.linalg.linalg.LinAlgError:给定了一维数组。数组必须是二维的
查看文档,似乎在R中使用了LAPACK的
DQRDC(2)
/
DGEQP3
/
ZGEQP3
,而Numpy使用了LAPACK的
dgeqrf
zgeqrf
dorgqr
,以及
zungqr
。显然,R对一维矩阵满意,而Numpy则不满意

问题


如何使用Numpy复制R的QR分解?

如错误消息中所述

数组必须是二维的

编辑
下面的代码与上面删除的代码没有什么不同,但是谁知道呢

在Python/Numpy中,数组只能有一个维度,但是
qr
需要一个二维数组

例如,在Python中,转置不会修改本质上是一维向量的维度

In [9]: print(v); print(v.T)                                                              
[1 1 1 1]
[1 1 1 1]

[10]: print(v.shape); print((v.T).shape)                                                
(4,)
(4,)
在R中,
qr()
尝试将其输入强制为二维数组(矩阵),因此
qr()
为您执行此步骤,而在Python中您必须显式执行此步骤


向Numpy数组添加维度最惯用的方法是在slice对象中使用
None
,表示向其添加虚拟维度。

@Gregor感谢您的澄清。我今晚安装了一个R。。。我不得不说,当我看到
dim(v)
打印
NULL
时,我有点困惑。我试图按照你的建议编辑我的答案。似乎
np.ones(4)
生成一个行向量,
np.ones([4,1])
生成一个列向量。行向量失败(参见上面的问题),列向量成功(尽管与R的qr分解不同)。这与你的答案有什么关系?@spreable_phd_syndrome“
np.ones(4)
生成一个行向量“对不起,它不生成一维数组,行向量是一个二维数组,有
1
行和
N
列(请看一看转置的例子,当我开始使用Numpy时,我很难理解这个)。֎֎֎֎֎֎֎֎֎֎֎֎֎֎֎从?我在这两种情况下都看到了
[-1/2,-1/2,-1/2]
[-2]
。。。֎֎֎符合我的答案吗?你能展开一下吗?请展示一个在Python中成功运行的例子,我接受它作为答案。
In [28]: from numpy.linalg import qr 
    ...: from numpy import ones

In [29]: v = ones(4) ; print(v.shape) ; print(v[:,None].shape) # adding a dimension
(4,)
(4, 1)

In [30]: q, r = qr(v[:, None])

In [31]: print(q) ; print() ; print(r)                 
[[-0.5]
 [-0.5]
 [-0.5]
 [-0.5]]

[[-2.]]

In [32]:
In [9]: print(v); print(v.T)                                                              
[1 1 1 1]
[1 1 1 1]

[10]: print(v.shape); print((v.T).shape)                                                
(4,)
(4,)