私のコードの処理には約 2 時間かかります。ボトルネックは for ループと if ステートメントにあります (コード内のコメントを参照)。私はPythonの初心者です:)ネストされたforステートメントとifステートメントを置き換える効率的なPythonの方法を誰かが推奨できますか?
〜3000万行のテーブルがあり、各行には(x、y、z)値があります:
20.0 11.3 7
21.0 11.3 0
22.0 11.3 3
...
私の望む出力は、x、y、min(z)、count(min(z)) の形式のテーブルです。最後の列は、その (x,y) における最小の z 値の最終カウントです。例えば:
20.0 11.3 7 7
21.0 11.3 0 10
22.0 11.3 3 1
...
一意の座標は約 600 しかないため、出力テーブルは 600x4 になります。私のコード:
import numpy as np
file = open('input.txt','r');
coordset = set()
data = np.zeros((600,4))*np.nan
irow = 0
ctr = 0
for row in file:
item = row.split()
x = float(item[0])
y = float(item[1])
z = float(item[2])
# build unique grid of coords
if ((x,y)) not in coordset:
data[irow][0] = x
data[irow][1] = y
data[irow][2] = z
irow = irow + 1 # grows up to 599
# lookup table of unique coords
coordset.add((x,y))
# BOTTLENECK. replace ifs? for?
for i in range(0, irow):
if data[i][0]==x and data[i][1]==y:
if z > data[i][2]:
continue
elif z==data[i][2]:
ctr = ctr + 1
data[i][3]=ctr
if z < data[i][2]:
data[i][2] = z
ctr = 1
data[i][3]=ctr
編集:参考までに、@ Joowaniによるアプローチは1m26sで計算されます。私の最初のアプローチ、同じコンピューター、同じデータファイル、106m23s。 edit2: @Ophion と @Sibster の提案に感謝します。有用な回答を +1 するのに十分なクレジットがありません。