2015-11-05 57 views
0

我有以下問題:我有兩個曲面方程,我正在看他們是零點。所以,我有以下幾點:如何在numpy中找到meshgrid的索引值

b = np.arange(0,2,0.1) 
k = np.arange(0,50,1) 
b,k = np.meshgrid(b,k) 

這些我產生z1z2,大量的公式,但它們都使用bk

z1 = ((0.5*rho*k**2 * Vd**2 * c)*(Cl * 0.1516*b**3 + 
     Cd*(((b*np.sqrt(b**2 * k**2 +1))/(2*k**2)) - 
     ((np.log(np.sqrt(b**2 * k**2 + 1) + b*k))/(2*k**3)))) - F) 

z2 = ((Cl * 0.1516 * b**3 * k**(-1)) - 
     ((Cd/(8*k**4))*((3*np.log(np.sqrt(b**2 * k**2 + 1) + b*k)) + 
     (b*np.sqrt(b**2 * k**2 +1)*(2*b**2 * k**2 -3)*k)))) 

現在我知道如何找到它的最近點z1和z2是零。就像下面:

print min(z1[(-0.1<z1)&(z1<0.1)]), min(z2[(-0.1<z2)&(z2<0.1)]) 

但與這些我只得到z值,它給了我一個接近零值。我需要的是找出哪個bk的值與z1z2的給定結果相對應。

我試圖索引它,但我似乎沒有做到這一點。

回答

1

在這種情況下,您的「接近零」表達式(-0.1<z1)&(z1<0.1)是一組布爾值。要找到True項目的索引,只需使用nonzero()

(-0.1<z1) & (z1<0.1).nonzero() 

例如:

>>> np.array([False, False, True, False, True, True, False]).nonzero() 
(array([2, 4, 5]),) 
0

爲什麼不使用argmin在Z1和Z2的絕對值?

實施例如何使用argmin:

>>> t = np.random.rand(4,3) 
>>> t 

array([[ 0.55809884, 0.34630428, 0.78713403], 
     [ 0.15125035, 0.07231524, 0.06975387], 
     [ 0.63233302, 0.48026985, 0.21420412], 
     [ 0.32713745, 0.95168682, 0.34994332]]) 

>>> np.min(t) 

0.069753866909461171 

>>> np.argmin(t) 

5 

>>> t[5//3, 5%3] # 5 is the argmin, 3 is my number of columns 

0.069753866909461171 
+1

的更一般的方法是使用['np.unravel_index'](http://docs.scipy.org/doc/numpy/reference/generated /numpy.unravel_index.html),例如'np.unravel_index(np.argmin(t),t.shape)' –

+0

好的,事情是,在這裏你只使用一個參數「t」。怎麼樣多個參數? – user3604362

+0

你是什麼意思?最後一行顯示瞭如何從解開的參數到數組中的2個「座標」。 ali_m指出瞭如何直接得到這兩個座標 - 或者如果你在N維數組中工作 - 這些我都不知道,謝謝ali_m! – Julien