0

嘿伙计们,这很混乱......

我试图通过以下方式找到数组的最小值:

for xpre in range(100): #used pre because I am using vapor pressures with some x molarity
        xvalue=xarray[xpre]
        for ppre in range(100): #same as xpre but vapor pressures for pure water, p
            pvalue=parray[p]
            d=math.fabs(xvalue-pvalue) #d represents the difference(due to vapor pressure lowering, a phenomenon in chemistry)
            darray.append(d) #darray stores the differences
        mini=min(darray) #mini is the minimum value in darray
        darr=[] #this is to make way for a new set of floats

所有的数组(xarr、parr、darr)都已经定义了,什么没有。他们每个人有 100 个花车

所以我的问题是如何找到找到 min(darr) 的 pvap 和 xvap @ ?

编辑 更改了一些变量名称并添加了变量描述,对不起各位

4

2 回答 2

2

几件事:

  1. 尝试enumerate
  2. 不是darra list,而是使用 adict并将dvp值存储为键,将xindexandpindex变量作为值

这是代码

for xindex, xvalue in enumerate(xarr):
  darr = {}
  for pindex, pvalue in enumerate(parr):
    dvp = math.fabs(xvalue - pvalue)
    darr[dvp] = {'xindex': xindex, 'pindex': pindex}
  mini = min(darr.keys())
  minix = darr[mini]['xindex']
  minip = darr[mini]['pindex']
  minindex = darr.keys().index(mini)


  print "minimum_index> {0}, is the difference of xarr[{1}] and parr[{2}]".format(minindex, minix, minip)
  darr.clear()

解释

enumerate函数允许您遍历列表并接收项目的索引。它是您的range(100). 请注意,我没有在 index 处获得值的行xpreppre这是因为该enumerate函数将 index 和 value 作为元组提供给我。

然而,最重要的变化是,您darr不再是这样的列表:

[130, 18, 42, 37 ...]

它现在是这样的字典:

{
  130: {'xindex': 1, 'pindex': 4},
  18: {'xindex': 1, 'pindex': 6},
  43: {'xindex': 1, 'pindex': 9},
  ...
}

所以现在,dvp我不仅将值单独存储,还将索引存储到其中xp生成这些dvp值。现在,如果我想知道一些事情,比如说,哪个xpvalues 产生了dvp43 的值?我会这样做:

xindex = darr[43]['xindex']
pindex = darr[43]['pindex']
x = xarr[xindex]
p = parr[pindex]

现在xp是有问题的价值观。

请注意,我个人会存储产生特定 的值dvp,而不是这些值的索引。但是你要了指数,所以我给了你这个答案。我将假设您有理由想要处理这样的索引,但在 Python 中,当您以 Python 方式编程时,通常不会发现自己以这种方式处理索引。这是一种非常 C 的做事方式。

于 2010-08-17T05:56:43.223 回答
0

编辑:这不能回答 OP 的问题:

min_diff, min_idx = min((math.fabs(a - b), i) for i, (a, b) in enumerate(zip(xpre, ppre)

右到左:

zip 采用 xpre 和 ppre 并分别制作第一个、第二个、...元素的元组,如下所示:

[ (xpre[0],ppre[0]) , (xpre[1],ppre[1]) , ... ]

enumerate enumerates 通过从 0 向上计数来添加索引:

[ (0 , (xpre[0],ppre[0]) ) , (1 , (xpre[1],ppre[1]) ) , ... ]

这将解包每个嵌套元组:

for i, (a, b) in ...

i 是 enumerate 生成的索引,a 和 b 是 xarr 和 parr 的元素。

这构建了一个由差异和索引组成的元组:

(math.fabs(a - b), i)

min(...) 之间的全部内容是生成器表达式。min 然后在这些值中找到最小值,然后赋值将它们解包:

min_diff, min_idx = min(...)
于 2010-08-17T06:05:53.077 回答