matlab中单引号(')是什么意思,怎么改成python

What is the meaning of single quote(') in matlab, and how to change it to python

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 来完成与 '.但它显示错误。

Matlab中的“'”是矩阵的'transpose'。 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]])

希望对你有帮助

简答:

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]) 创建了一个一维数组。转置是沿特定维度翻转数组。当只有一个维度时,这是没有意义的,所以转置不会做任何事情。

"But,"你可能会反对,"didn't a transpose of the 1D MATLAB matrix work?"原因更根本的是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

这似乎是合理的。二维数组具有二维,一维数组具有一维,而标量具有零维。但是在 MATLAB 中尝试同样的事情:

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

ans =

     2

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

ans =

     2

>> ndims(1)

ans =

     2

万物皆有二维! MATLAB 没有 1D 或 0D 数据结构,MATLAB 中的所有内容必须 至少有 2 个维度(尽管可以在 MATLAB 中创建您自己的有效 1D 或 0D class) .因此,在 MATLAB 中对“一维”数据结构进行转置是可行的,因为它实际上不是一维的。

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

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

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