2016-11-13 48 views
0

我想解决一个最小值问题,我可以从两个循环中获取最小值,但是,我真正需要的也是相应的输出最小值的确切值。如何查找循环中的哪个输入值产生最小输出?

from __future__ import division 
from numpy import* 
b1=0.9917949 
b2=0.01911 
b3=0.000840 
b4=0.10175 
b5=0.000763 
mu=1.66057*10**(-24) #gram 
c=3.0*10**8 

Mler=open("olasiM.txt","w+") 
data=zeros(0,'float') 
for A in range(1,25): 
    M2=zeros(0,'float') 
    print 'A=',A 
    for Z in range(1,A+1): 
     SEMF=mu*c**2*(b1*A+b2*A**(2./3.)-b3*Z+b4*A*((1./2.)-(Z/A))**2+(b5*Z**2)/(A**(1./3.))) 
     SEMF=array(SEMF) 
     M2=hstack((M2,SEMF)) 
    minm2=min(M2)  
    data=hstack((data,minm2)) 
    data=hstack((data,A)) 
datalist = data.tolist() 

for i in range (len(datalist)): 
    Mler.write(str(datalist[i])+'\n') 
Mler.close() 

在这里,我要的就是看SEMF和相应AZ值,例如,它必须是A=1,​​和SEMF= some# 我也不知道怎么的最小值把这些,AZ的值写入文档

+0

哪里是'zeros','array' ,和'hstack'定义?他们是Numpy功能吗?如果是这样,你需要添加'numpy'标签到你的问题。否则,人们不会知道你正在寻找一个Numpy解决方案。 –

+0

我相信,我纠正了开始部分。感谢您指出。 –

+0

等一等,在你的循环中,“SEMF”只是一个数字?我不明白你为什么要做这个循环,并且当你可以使用一些向量化操作时,使用'hstack'逐个添加元素...创建数组'As = np.array(range(1,25) ,dtype = float)'(选择合适的'dtype'),然后通过使用'A'完成相同的操作来获得'SEMF'数组,然后使用该数组,然后您将获得所有结果的数组你可以做'the_mins = min(SEMF)'。你也许能够矢量化外层循环...... – Bakuriu

回答

1

numpy使用python列表的最大好处是矢量化操作。不幸的是,你的代码完全无法使用它们。例如,具有Z作为索引的整个内部循环可以很容易地进行矢量化。而是使用python float s计算单个元素,然后在numpy数组M2中将它们逐个堆叠。

所以我想通过重构代码的一部分:

import numpy as np 
# ... 

Zs = np.arange(1, A+1, dtype=float) 
SEMF = mu*c**2 * (b1*A + b2*A**(2./3.) - b3*Zs + b4*A*((1./2.) - (Zs/A))**2 + (b5*Zs**2)/(A**(1./3.))) 

这里SEMF数组应该是你获得的最终M2阵到底是什么。现在,你可以找到的最小和堆栈价值到您的data阵列:

min_val = SEMF.min()  
data = hstack((data,minm2)) 
data = hstack((data,A)) 

如果您还什么跟踪为其中的Z价值,你得到了你可以使用argmin方法的最小值:

min_val, min_pos = SEMF.min(), SEMF.argmin() 
data = hstack((data,np.array([min_val, min_pos, A]))) 

最后的代码应该是这样的:

from __future__ import division 
import numpy as np 

b1 = 0.9917949 
b2 = 0.01911 
b3 = 0.000840 
b4 = 0.10175 
b5 = 0.000763 
mu = 1.66057*10**(-24) #gram 
c = 3.0*10**8 

data=zeros(0,'float') 
for A in range(1,25): 
    Zs = np.arange(1, A+1, dtype=float) 
    SEMF = mu*c**2 * (b1*A + b2*A**(2./3.) - b3*Zs + b4*A*((1./2.) - (Zs/A))**2 + (b5*Zs**2)/(A**(1./3.))) 

    min_val, min_pos = SEMF.min(), SEMF.argmin() 
    data = hstack((data,np.array([min_val, min_pos, A]))) 

datalist = data.tolist() 

with open("olasiM.txt","w+") as mler: 
    for i in range (len(datalist)): 
     mler.write(str(datalist[i])+'\n') 

请注意,numpy提供了一些功能来保存/加载数组到/从文件,如savetxt,所以我建议,而不是手动保存值,以使用这些功能。


也许有些numpy专家也向量化为As操作。不幸的是,我的numpy知识并不那么先进,我不知道如何处理由于range(1, A+1)事情我们会有可变数量的维度的事实......

相关问题