我正在尝试将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
是一个复数数组。很抱歉没有提供整个代码(太大了)。
答案 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_a
和Y_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]