2013-08-01 95 views
1

我想将Matlab代码转换为Python,并且在转换一行时遇到了问题。我是对还是不对?我不知道如何在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' object is not iterable

的问题是在最后一行。 diff_a是一个复数数组。对不起,没有提供整个代码(它太大)。

+0

的错误是因为Python认为您正尝试分配到两个变量,你只有一个值。相反,只需分配一个变量或使用'real'和'imag'方法提取每个片段。 – Justin

+0

是不是'diff_a.min()'? – Dan

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

感谢fou的背景解释OP的意图... –

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()返回一个值

+0

请注意,OP对'ssa'和'check'使用不同的索引。另外,'I_a'应该是'argmin'。 – tiago

0
min(diff_a) 

收益最小物体从迭代这在你的案例显然是一个浮动,你不能迭代一个浮动,但这是你在你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] 
1

的问题是,你是一个单一的价值min(diff_a)回到列表[Y_a, I_a]

min(diff_a)找到可迭代中的最小值,在这种情况下为diff_a。您不能将一个值分配给列表。尝试类似

result = min(diff_a) 

或只是

print min(diff_a)