Skip to main content
 首页 » 编程设计

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

2025年05月04日8zlslch

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中的'运算符是矩阵(共轭)转置运算符。它围绕维度翻转矩阵,并采用矩阵的复共轭(第二部分是使人绊倒的东西)。简短的答案是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转置运算符为 .'。所以你考虑一下:

>>> 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]] 


注意虚部没有任何负数。如果要获取复数共轭转置,则需要使用 .T或 np.conj(a)来获取复数共轭(在进行转置之前或之后)。但是,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] 


??它什么也没做。原因是 a.conj()创建一维数组。转置使数组沿特定维度翻转。当只有一维时,这是没有意义的,因此转置不会执行任何操作。

“但是,”您可能会反对,“一维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 


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

共轭转置和一维转置问题都归结为基本数据类型MATLB和numpy的使用。 MATLAB使用固有地至少为2D的矩阵。另一方面,nump使用的数组可以具有任意数量的维。 MATLAB矩阵使用矩阵数学作为其常规运算(因此MATLAB中的 np.array([1, 2, 3, 4, 5, 6])是矩阵乘积),而Python数组使用逐元素数学作为其常规运算符(因此 a * b是逐元素乘积,等效( a * b在MATLAB中)。 MATLAB具有逐个元素的运算符,而numpy数组具有矩阵运算符(尽管尚未考虑矩阵转置,尽管正在考虑添加一个),所以这主要适用于默认操作。

为了避免在Python中出现此问题,有几种解决方法。在Python中使用 a .* b进行索引会插入其他尺寸。因此,对于一维数组 None, a将是二维数组,其中第一维的长度为 a[None]。如果您不提前知道数组的维数,可以使用 1,这将确保 np.atleast_2d(a)至少具有二维。因此0D变成2D,1D变成2D,2D保持2D,3D保持3D,4D保持4D,依此类推。

就是说,numpy在所有这些方面都具有与MATLAB相同的矩阵类(它甚至具有共轭转置运算符 a)。不要使用它。 python社区已经围绕数组进行了标准化,因为实际上这几乎总是您想要的。这意味着大多数Python工具都期望使用数组,并且如果给定矩阵,许多工具都会发生故障,或者会将其转换为数组。因此,只需使用数组。