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

Sai*_*toD 1 python matlab transpose matrix

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); 
Run Code Online (Sandbox Code Playgroud)

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

The*_*Cat 8

简短回答:

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

答案稍长一点:

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

很长的答案:

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

>> 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
Run Code Online (Sandbox Code Playgroud)

所以看起来很清楚,'做一个转置.但这是骗人的:

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
Run Code Online (Sandbox Code Playgroud)

所有这些负面消息来自哪里?它们不在原始阵列中.其原因在文档中描述.'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]]
Run Code Online (Sandbox Code Playgroud)

注意假想部分没有任何负面影响.如果你想得到复共轭转置,你需要使用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]
Run Code Online (Sandbox Code Playgroud)

咦?它什么都没做.原因是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
Run Code Online (Sandbox Code Playgroud)

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

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

ans =

     2

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

ans =

     2

>> ndims(1)

ans =

     2
Run Code Online (Sandbox Code Playgroud)

一切都有2个维度!MATLAB没有1D或0D数据结构,MATLAB中的所有内容必须至少有2个维度(尽管可以在MATLAB中创建自己的1D或0D类).因此,在MATLAB中对"1D"数据结构进行转置是因为它实际上不是1D.

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

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

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

  • 你有我的投票支持复杂的转置.这是每个在MATLAB中编码的人都需要知道何时使用```.+1. (5认同)