2

私はPythonが初めてです...ここに私の問題があります。Python でテストしている最適化サブルーチンの場合、csv ファイルを数値で解析する必要があります。

したがって、csv ファイルの形式は次のようになります。

Support load summary for anchor at node 5,

Load combination,FX (N),FY (N),FZ (N),MX (Nm),MY (Nm),MZ (Nm),,

Sustained,-3,-2679,120,2012,164,69,,
Operating1,1472,2710,-672,-4520,8743,-2047,,
Maximum,1472,2710,120,2012,8743,69,,
Minimum,-3,-2679,-672,-4520,164,-2047,,

Support load summary for anchor at node 40,

Load combination,FX (N),FY (N),FZ (N),MX (Nm),MY (Nm),MZ (Nm),,

Sustained,9,-3872,-196,-91,854,-3914,,
Operating1,-2027,-8027,3834,-7573,-9102,-6323,,
Maximum,9,-3872,3834,-91,854,-3914,,
Minimum,-2027,-8027,-196,-7573,-9102,-6323,,

Support load summary for anchor at node 125,

Load combination,FX (N),FY (N),FZ (N),MX (Nm),MY (Nm),MZ (Nm),,

Sustained,-7,-2448,76,264,83,1320,,
Operating1,556,-3771,-3162,-6948,-1367,1272,,
Maximum,556,-2448,76,264,83,1320,,
Minimum,-7,-3771,-3162,-6948,-1367,1272,,

Support load summary for Hanger at node 10,

Load combination,Load (N),,

Sustained,-3668,,
Operating1,-13876,,
Maximum,-3668,,
Minimum,-13876,,

Support load summary for Hanger at node 20B,

Load combination,Load (N),,

Sustained,-14305,,
Operating1,-13359,,
Maximum,-13359,,
Minimum,-14305,,

Support load summary for restraint at node 115B,

Load combination,FX (N),FY (N),FZ (N),,

Sustained,,-5655,,,
Operating1,3696,,
Maximum,,3696,,,
Minimum,,-5655,,,

私のコードは、主にで始まる行で動作します

Operating1,
Maximum, 
Minimum,

仕事 (コスト関数) は、これらのキーワードの 1 つに続くすべての数値を (代数的に) 合計することです。上のデータ ファイルでわかるように、2 列目または 3 列目に数字が 1 つしかない場合があります。(データ ファイルの末尾を参照)、場合によっては、次のファイル フラグメントのように番号がまったくないことがあります (下の Operating1 の行を参照)。

Support load summary for Hanger at node 115B,

Load combination,Load (N),,

Sustained,-5188,,
Operating1,,,
Maximum,,,
Minimum,-5188,,

np.genfromtxt() を使用しています。列に4つ未満の値がある行に遭遇した場合、またはまったく値がない場合を除いて、うまく機能します。

genfromtxt() で sum() を使用しています - コードを参照してください。値が 1 つしかない場合は、float() を使用しました。ない場合は、特定して合計にゼロを割り当てようとしました。ケースごとにカスタマイズできますが、予測できないケースで数値を読み取って合計する一般的でより抽象的な方法があるかどうか疑問に思っています。

さらに、「missing_values」と「filling_values」を試しましたが、うまくいかないようです。ファイル内のゼロ以外の列の数をカウントするにはどうすればよいですか?

これまでのコードの一部を次に示します。

def optimize(fn, optflag):

    modeltotals = []
    i=0
    csv1 = []
    j = 1 # line # count

    for line in csv.reader(filelist) :
    temp = repr(line)  

    if "Support load summary" in temp :
       csv1.append(line) # just making another list of actionable lines for future use
       if (d): print "\n", line
       continue
    if (optflag == "ope") : # optimize on Operating loads
       if "Operating1" in temp:
          csv1.append(line)
          if (len(line) > 4):
              modeltotals.append(sum(np.genfromtxt(line[1:], delimiter=",")))
              if (d): print "Sum of OPE Loads:", modeltotals[i], "\n"
          elif (len(line) > 0 and len(line) <= 4):
              if (d): print "line=", line, "length", len(line)
              line1 = np.genfromtxt(line[1:], delimiter=",")
              if not line1: # meaning if array is empty
                  modeltotals.append(0)
              else:
                  modeltotals.append(np.genfromtxt(line[1:], delimiter=",", missing_values=[0,0,0,0]))
              if (d): print "OPE Max:", modeltotals[i],"\n"

          i +=1
    elif (optflag == "minmax") : #optimize on all loads, min and max.
       #print  "i=", i
       if "Maximum" in temp:
          csv1.append(line)
          if (len(line) > 4):
              modeltotals.append(sum(np.genfromtxt(line[1:], delimiter=",")))
              if (d): print "Sum of Maxs:", modeltotals[i]
          elif (len(line) <= 4):
              #line1 = np.genfromtxt(line[1:], delimiter=",", filling_values = 0)
              #modeltotals.append(sum(line1))

              if (d): print "line=", line, "length", len(line)
              line1 = np.genfromtxt(line[1:], delimiter=",")
              print "line1 =", line1
              if not line1: # meaning if array is empty
                  modeltotals.append(0) 
              else:
                  modeltotals.append(np.genfromtxt(line[1:], delimiter=",", filling_values = 0))
              if (d): print "Max:", modeltotals[i]

          i+=1
       elif "Minimum" in temp:
          csv1.append(line)
          if (len(line) > 4):
              #print "#", j, "line", line
              modeltotals.append(sum(np.genfromtxt(line[1:], delimiter=",")))
              if (d): print "Sum of Mins:", modeltotals[i]

          elif (len(line) > 0 and len(line) <= 4):
              if (d): print "line=", line, "length", len(line)
              line1 = np.genfromtxt(line[1:], delimiter=",")
              if not line1: # meaning if array is empty
                  modeltotals.append(0)
              else:
                  modeltotals.append(np.genfromtxt(line[1:], delimiter=","))
              if (d): print "Min:", modeltotals[i]

          i +=1
    j+=1
 if len(modeltotals) > 0:
     print modeltotals
     average = float(sum(modeltotals))/len(modeltotals)  #sometimes error here
 else:
     return "000"  # error, seems like no file was analyzed
 if (d):
     print "Current model mean =", average

 del csv1[:]
 return abs(average)

さまざまなファイルで発生するいくつかのエラーは似ています。

['Support load summary for restraint at node 20B', '']
Traceback (most recent call last):
File "sor4.py", line 190, in <module>
modelmean[filename] = optimize(filename, args.optimizeon)
  File "sor4.py", line 107, in optimize
   modeltotals.append(sum(np.genfromtxt(line[1:], delimiter=",")))
TypeError: iteration over a 0-d array

もう 1 つのエラーは、「スカラーに変換できません」です。

私はエラーを理解していますが、それらを巧みに処理するための Python についてはあまり知りません。長い投稿で申し訳ありません。情報をより簡潔に提示できるようになります。ここの別のポスターが言ったように、私はあなたの答えを感謝して受け入れます. ありがとうございました。

4

1 に答える 1

1

問題を次のコードに減らしました。nans と空の入力文字列をチェックします。

from StringIO import StringIO
import numpy as np

def getnumbers(s):
    try:
        res = np.genfromtxt(s, delimiter=",")
        return res[np.where(np.isnan(res), False, True)]
    except IOError as ioe:
        return np.array(0.)

print(sum(getnumbers(StringIO('1., 2., , '))))
print(sum(getnumbers(StringIO(''))))

それは結果を与える

3.0
0.0
于 2012-11-28T08:31:14.790 に答える