2014-02-13 51 views
0

路口沿情節線我有一個由子陣列狀的列表:提取最低陣列的列表中,用自己的Python

[array(.....),array(.....),array(.....),....] 

所有數組的長度是相同的(基本上每個數組代表一條線)。

我想提取元素的最小值元素。所以如果每個數組有100個元素,那麼我希望最終列表的長度爲100個元素。我也想要這些線相交的點。像這樣的東西應該澄清我的意思是:

https://www.dropbox.com/s/xshkhvqp0ay3vxc/g14.png

+0

您計算最小值的部分是'numpy.min(l,axis = 0)'。不知道關於陰謀或你的意思是交叉點。 – user2357112

+1

數組如何表示行? – user2357112

+0

@ user2357112通過使用類似x = array(linspace(0,2.4,100))和y = x + 2或x * 3等的東西...這將是線性的並且可以表示一條線! – hat

回答

0

我沒有聲稱這是最好的方式來做到這一點,因爲沒有完全圍繞Python思考。我在計算相圖時編寫了類似問題的解決方案。在給定的溫度下,對於不同相的一定數量的自由能函數,總體最小自由能曲線是多少,哪一個函數是每個點的最小值。

G = [] 
while iPhase < len(f): # loop through all free energy functions 
    G.append(f[iPhase](x)) # x is an array of x values 
    iPhase = iPhase+1 
minG = G{0][:] # define an overall minimum free energy curve, starting with 0'th 
minF = np.zeros(len(minG)) # prepare for index indicating which function f[i](x) is min 
iPhase = 1 
while iPhase < len(f): 
    nextF = iPhase*np.ones(len(x0, dtype=np.int) 
    np.less(G[iPhase],minG, nextF) # where is next free energy function less than current min 
    minG = np.minimum(minG, G[iPhase]) # new overall minimum 
    minF = np.ma.filled(np.ma.array(minF, mask=nextF), fill_value=iPhase) # new index as needed 
    iPhase = iPhase+1 

因此,最終輸出是一個總體最小值minG,以及它來自哪個曲線的索引(minF)。現在,如果要優化交叉點,可以使用

changes = np.array(np.where(minF[:-1]!=minF[1:])) 

返回指示線在哪裏交叉以及涉及哪些功能。如果他們不同的函數是真正的線y = mx * b,那麼可以通過代數來得到確切的交叉點。對於更復雜的函數,需要一個更復雜的過程(我將臨時函數定義爲兩者之間的差異,然後使用scipy.optimize.newton來獲得零)。

0

讓說,你有以下列表:

>>> l = [array('i', [5, 15, 1, 25]), 
     array('i', [5, 15, 2, 25]), 
     array('i', [5, 15, 3, 25])] 

您可以獲取每個數組的最小值下列要求:

>>> [min(x) for x in l] 
[1, 2, 3] 

對不起,但我不明白你的問題的其餘部分:)

0

像這樣:

>>> import numpy as np 
>>> np.random.seed(0) 
>>> data = np.random.rand(3, 4) 
>>> data 
array([[ 0.5488135 , 0.71518937, 0.60276338, 0.54488318], 
     [ 0.4236548 , 0.64589411, 0.43758721, 0.891773 ], 
     [ 0.96366276, 0.38344152, 0.79172504, 0.52889492]]) 
>>> result = data.min(axis=1) 
>>> result 
array([ 0.54488318, 0.4236548 , 0.38344152]) 
>>> 
0

的兩條線的交叉點可以通過代數找到 AX + B = CX + d

意味着:X =(分貝)/(AC)

因此在python中,你所要做的就是將每個數組與一個對(a,b)聯繫起來,這些可以通過從數組中獲取任意兩個點來找到,或者如果必須的話,通過最小二乘方擬合:-)

這會給你成對的交點,但這是一個N^2算法。據推測,你可以通過掃描做得更好,但在這一點上,計算幾何文本是爲了