matlab中单引号(')的含义是什么,以及如何将其更改为python

时间:2016-10-06 00:03:00

标签: python matlab matrix transpose

grad = (1/m * (h-y)' * X) + lambda * [0;theta(2:end)]'/m; 
cost =  1/(m) * sum(-y .* log(h) - (1-y) .* log(1-h)) + lambda/m/2*sum(theta(2:end).^2); 

如何将这两行更改为python?我尝试使用zip做同样的工作'。但它显示错误。

2 个答案:

答案 0 :(得分:8)

简答:

MATLAB中的'运算符是矩阵(共轭)转置运算符。它围绕维度翻转矩阵并采用矩阵的复共轭(第二部分是让人兴奋的)简短的答案是Python中a'的等价物为np.atleast_2d(a).T.conj()

答案稍长:

除非你真的知道你在做什么,否则不要在MATLAB中使用'。使用.',这是普通的转置。它相当于Python中的np.atleast_2d(a).T(没有共轭)。如果您确定python中的a.ndim >= 2,那么您可以使用a.T。如果您确定Python中的a.ndim == 1,则可以使用a[None].T。如果你确定Python中的a.ndim == 0那么转置是没有意义的,那就做你想做的任何事情。

很长答案:

关于转置的基本思想是它在一个维度上翻转一个数组或矩阵所以考虑一下:

>> a=[1,2,3,4,5,6]

a =

    1     2     3     4     5     6

>> a'

ans =

    1
    2
    3
    4
    5
    6

>> b=[1,2,3;4,5,6]

b =

    1     2     3
    4     5     6

>> b'

ans =

    1     4
    2     5
    3     6

所以看起来非常清楚,'进行转置。但那是欺骗性的:

c=[1j,2j,3j,4j,5j,6j]

c =

Columns 1 through 3

0.000000000000000 + 1.000000000000000i  0.000000000000000 + 2.000000000000000i  0.000000000000000 + 3.000000000000000i

Columns 4 through 6

0.000000000000000 + 4.000000000000000i  0.000000000000000 + 5.000000000000000i  0.000000000000000 + 6.000000000000000i

>> c'

ans =

0.000000000000000 - 1.000000000000000i
0.000000000000000 - 2.000000000000000i
0.000000000000000 - 3.000000000000000i
0.000000000000000 - 4.000000000000000i
0.000000000000000 - 5.000000000000000i
0.000000000000000 - 6.000000000000000i

所有这些负面消息来自哪里?它们不在原始数组中。 documentation中描述了其原因。 MATLAB中的'运算符不是普通的转置运算符,正常的转置运算符是.''运算符执行复共轭转置。它进行矩阵的转置并完成该矩阵的复共轭。

问题是这几乎不是你真正想要的。例如,它将导致代码看起来像预期的那样工作,但会静默地改变您的FFT数据。因此,除非您绝对确定您的算法需要复杂的共轭转置,否则请使用.'

对于Python,Python转置运算符是.T。所以你考虑一下:

>>> a = np.array([[1, 2, 3, 4, 5, 6]])
>>> print(a)
[[1 2 3 4 5 6]]
>>> print(a.T)
[[1]
 [2]
 [3]
 [4]
 [5]
 [6]]
>>> b = np.array([[1j, 2j, 3j, 4j, 5j, 6j]])
[[ 0.+1.j  0.+2.j  0.+3.j  0.+4.j  0.+5.j  0.+6.j]]
>>> (1j*np.ones((1,10))).T
[[ 0.+1.j]
 [ 0.+2.j]
 [ 0.+3.j]
 [ 0.+4.j]
 [ 0.+5.j]
 [ 0.+6.j]]

注意假想部分没有任何负面影响。如果要获得复共轭转置,则需要使用np.conj(a)a.conj()来获得复共轭(在转置之前或之后)。然而,numpy有自己的转置陷阱:

>>> c = np.array([1, 2, 3, 4, 5, 6])
>>> print(c)
[1 2 3 4 5 6]
>>> print(c.T)
[1 2 3 4 5 6]

咦?它没有做任何事情。原因是np.array([1, 2, 3, 4, 5, 6])创建了一维数组。转置是沿特定维度翻转阵列。当只有一个维度时,这是没有意义的,因此转置不会做任何事情。

"但是,"您可能会反对,"没有1D MATLAB矩阵的转置工作?"原因是MATLAB和numpy如何存储数据更为基础。考虑Python:

>>> np.array([[1, 2, 3], [4, 5, 6]]).ndim
2
>>> np.array([1, 2, 3, 4, 5, 6]).ndim
1
>>> np.array(1).ndim
0

这似乎很合理。 2D数组具有两个维度,一维数组具有一个维度,标量具有零维度。但是在MATLAB中尝试相同的事情:

>> ndims([1,2,3;4,5,6])

ans =

     2

>> ndims([1,2,3,4,5,6])

ans =

     2

>> ndims(1)

ans =

     2

一切都有2个维度! MATLAB没有1D或0D数据结构,MATLAB 中的所有内容必须至少有2个维度(尽管可以在MATLAB中创建自己的1D或0D类)。所以采取你的" 1D" MATLAB中的数据结构工作原因是它实际上并不是1D。

共轭转置和1D转置问题都归结为基本数据类型MATLB和numpy使用。 MATLAB使用矩阵,其本质上至少是2D。另一方面,nump使用可以具有任意数量维度的数组。 MATLAB矩阵使用矩阵数学作为它们的正常操作(因此MATLAB中的a * b是矩阵乘积),而Python数组使用逐元素数学作为它们的常规运算符(所以a * b是一个逐个元素的元素。元素乘积,相当于MATLAB中的a .* b。 MATLAB具有逐元素运算符,而numpy数组具有矩阵运算符(尽管还没有矩阵转置,但正在考虑添加一个),因此这主要适用于默认操作。

为了避免Python中的这个问题,有几种方法可以解决它。在Python中使用None进行索引会插入其他维度。因此,对于1D数组aa[None]将是2D数组,其中第一维的长度为1。如果您事先不知道阵列的维度是什么,则可以使用np.atleast_2d(a),这将确保a至少有两个维度。因此0D变为2D,1D变为2D,2D保持2D,3D保持3D,4D保持4D等。

话虽这么说,numpy有一个矩阵类,在所有这些方面与MATLAB相同(它甚至有一个共轭转置运算符.H)。 不要使用。 python社区已经对数组进行了标准化,因为在实践中几乎总是你想要的。这意味着大多数Python工具都需要数组,如果给定矩阵,很多都会出现故障,或者将它们转换为数组。所以只需使用数组。

答案 1 :(得分:1)

" ' "在Matlab中是转置'一个矩阵。 numpy包是python中科学计算的基础包。 numpy.transpose可用于执行相同的任务。

import numpy as np
matrix = np.arange(6).reshape((2,3))

这将创建一个包含两行和三列的矩阵,如下所示:

>>> array([[0, 1, 2],[3, 4, 5]])

然后转置为:

np.transpose (matrix)
>>> array([[0, 3],[1, 4],[2, 5]])

我希望它有所帮助