2016-11-13 46 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)事情我們會有可變數量的維度的事實......

相關問題