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. の代わりにdarrlistを使用して値をキーとしてdict保存し、および変数を値として保存します。dvpxindexpindex

これがコードです

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)です。xpreindex ,で値を取得する行がないことに注意してくださいppre。これは、enumerate関数がインデックスと値の両方をタプルとして提供するためです。

ただし、最も重要な変更点は、darr次のようなリストではなく、次のようになることです。

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

次のような辞書になりました。

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

そのため、値のみを格納するだけでなく、それらの値を生成dvpしたインデックスも格納してxいます。さて、何かを知りたい場合は、次のように言います。私はこれを行います:pdvpxpdvp

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

xとが問題pの値です。

私は個人的に、特定の を生成した値を格納し、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 を受け取り、次のように、それぞれ 1 番目、2 番目、... 要素のタプルを作成します。

[ (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 に答える