Python中的矩阵赋值

时间:2013-08-01 15:33:21

标签: python matlab numpy

我正在尝试将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 个答案:

答案 0 :(得分:5)

当你在Matlab中[C,I] = min(...)时,它means表示最小值将存储在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]

答案 1 :(得分: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_aY_a是形状(a,4)的数组。

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

[Y_a,I_a]=min(diff_a)

因为min()返回单个值

答案 2 :(得分:1)

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

min(diff_a)找到iterable中的最小值,在本例中为diff_a。您不能将一个值分配给列表。尝试像

这样的东西
result = min(diff_a)

或只是

print min(diff_a)

答案 3 :(得分:0)

min(diff_a)

返回来自iterable的最小对象,在你的情况下显然是浮点数,你不能迭代浮点数,但这是你在你的assignement中尝试做的事情:

[Y_a,I_a]=min(diff_a)

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

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

[Y_a,I_a]= sorted(diff_a)[:2]