1

我正在尝试将 Matlab 代码转换为 Python,并且在转换一行时遇到了问题。我是对还是错?我不知道如何在 Python 中进行赋值。

MATLAB:

 for j=1:a
     diff_a=zeros(1,4);
     diff_b=zeros(1,4);
     for i=1:4
         diff_a(i)=abs(ssa(j)-check(i));
         diff_b(i)=abs(ssb(j)-check(i));
     end
     [Y_a,I_a]=min(diff_a);
 end

Python:

for j in arange(0,a):
    diff_a=zeros(4)
    diff_b=zeros(4)
    for i in arange(0,4):
        diff_a[i]=abs(ssa[j]-check[i])
        diff_b[i]=abs(ssb[j]-check[i])
    [Y_a,I_a]=min(diff_a)

最后一行给出了这个错误:

TypeError:“numpy.float64”对象不可迭代

问题出在最后一行。diff_a是一个复数数组。很抱歉没有提供整个代码(它太大了)。

4

4 回答 4

5

当您[C,I] = min(...)在 Matlab 中进行操作时,这意味着最小值将存储在 中C,最小值的索引将存储在I. 在 Python/numpy 中,您需要为此调用两次。在您的示例中:

Y_a, I_a = diff_a.min(), diff_a.argmin()

但以下是更好的代码:

I_a = diff_a.argmin()
Y_a = diff_a[I_a]

您的代码可以再简化一点:

import numpy as np

for j in range(a):
    diff_a = np.abs(ssa[j] - check)
    diff_b = np.abs(ssb[j] - check)
    I_a = diff_a.argmin()
    Y_a = diff_a[I_a]
于 2013-08-01T16:07:32.160 回答
2

您可以通过以下方式简化和提高代码性能:

diff_a = numpy.absolute( np.subtract.outer(ssa, check) )
diff_b = numpy.absolute( np.subtract.outer(ssb, check) )
I_a = diff_a.argmin( axis=1 )
Y_a = diff_a.min( axis=1 )

这里I_a和是根据您的代码Y_a的形状数组。(a,4)

您收到的错误是因为您在执行以下操作时尝试解压缩一个numpy.float64值:

[Y_a,I_a]=min(diff_a)

因为min()返回单个值

于 2013-08-01T15:40:38.370 回答
1

问题是您将单个值返回min(diff_a)到 list [Y_a, I_a]

min(diff_a)找到可迭代的最小值,在本例中为diff_a. 您不能为列表分配一个值。尝试类似的东西

result = min(diff_a)

要不就

print min(diff_a)
于 2013-08-01T15:42:20.523 回答
0
min(diff_a)

从可迭代的返回最小对象,在您的情况下显然是一个浮点数,您不能迭代浮点数,但这是您在分配中尝试做的事情:

[Y_a,I_a]=min(diff_a)

您实际上是在尝试仅从一个值创建一个包含两项 Y_a 和 I_a 的新列表 - 这是将 min 函数应用于 diff_a 列表的结果。

如果您需要从 diff_a 获取两个最小值,请尝试以下操作:

[Y_a,I_a]= sorted(diff_a)[:2]
于 2013-08-01T15:41:28.943 回答