2014-02-13 23 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算法。据推测,你可以通过扫描做得更好,但在这一点上,计算几何文本是为了