3

float と文字列を含む 38 列と 1500 行以上の csv があります。このセットの float データの 3 列 (x、y、z) で の平均を求めますf=(x+y)/z。調査の後、これらの列を numpy 配列として分離し、実行することに成功しましたf=(x+y)/z。f を合計しようとすると、配列が加算されません。f を出力すると、1500 項目の正しい値が表示されますが、これらの合計は表示されません。

  reader=csv.reader(open('myfile.csv' ,"rb"),delimiter=',')
  reader.next()
  reader.next()
  x=list(reader)
  data=numpy.array(x)
  rows=data.shape[0]
  for i in range (0,rows):
      x=numpy.array(data[i,18]).astype('float')
      y=numpy.array(data[i,19]).astype('float')
      z=numpy.array(data[i,6]).astype('float')
      f=numpy.array((x+y)/z)
      average=numpy.sum(f)/rows
      print average
4

3 に答える 3

5

がすでに配列の場合、ループdataは必要ありません。for

x = data[:, 18].astype(float)
y = data[:, 19].astype(float)
z = data[:, 6].astype(float)
f = (x+y) / z
average = np.average(f)

次のようにファイルを読み取ることで、おそらくより良い結果が得られるでしょうnp.loadtxt

data = np.loadtxt('myfile.csv', dtype=float, delimiter=',' skiprows=2,
                  usecols=(6, 18, 19))

または を取得しx、直接:yz

x, y, z = np.loadtxt('myfile.csv', dtype=float, delimiter=',' skiprows=2,
                     usecols=(6, 18, 19), unpack=True)
于 2013-03-16T15:09:07.750 に答える
2

Numpy を使用すると、配列全体を操作できます。それらを反復処理する必要はありません。

reader=csv.reader(open('myfile.csv' ,"rb"),delimiter=',')
reader.next()
reader.next()
x=list(reader)
data=numpy.array(x)
rows=data.shape[0]

x=data[:,18].astype('float')
y=data[:,19].astype('float')
z=data[:,6].astype('float')

f = (x + y) / z
average = f.mean()

print average
于 2013-03-16T15:13:11.740 に答える
0

numpy に縛られていない場合は、ここに純粋な python ソリューションがあります。

import csv

def f(x, y, z):
    x = float(x)
    y = float(y)
    z = float(z)
    return (x+y)/z

reader = csv.reader(open("derp.csv", 'r'))
rows = list(reader)
len_of_rows = len(rows)

f_values = []

for row in rows:
    x = row[0]
    y = row[1]
    z = row[2]
    f_values.append(f(x, y, z))

average = sum(f_values)/len_of_rows
print average

これが私のderp.csvがどのように見えるかです

1,2,3
4,5,6
7,8,9
于 2013-03-16T15:05:57.660 に答える