gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:06:49 24 4
gpt4 key购买 nike

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


注意虚部没有任何负数。如果要获取复数共轭转置,则需要使用 .Tnp.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进行索引会插入其他尺寸。因此,对于一维数组 Nonea将是二维数组,其中第一维的长度为 a[None]。如果您不提前知道数组的维数,可以使用 1,这将确保 np.atleast_2d(a)至少具有二维。因此0D变成2D,1D变成2D,2D保持2D,3D保持3D,4D保持4D,依此类推。

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

关于python - Matlab中单引号(')的含义是什么,以及如何将其更改为python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39885495/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com