2

利き手でタイピングするほうが、利き手ではない手でタイピングするよりも速いという私の仮説を証明するために、データを収集する必要があります。参加者にランダムな単語を与え、それをコピーする必要がある以下のコードを書きました。コードは、各単語を入力するのにかかる時間を計り、そのデータを新しいファイルに保存します。テストされる参加者ごとに、新しい CSV ファイルが作成されます。

次に、各参加者の各ハンドの平均を求める別のスクリプトを作成し、その平均を含む 1 つの配列を作成して、仮説が正しいかどうかを証明するグラフを作成できるようにする必要があります。異なるファイルからデータを取得し、それを 1 つの配列に結合するにはどうすればよいですか?

私のスクリプト:

import random
import time

name = raw_input('Enter name: ')  # get some name for the file
outfile = file(name + '.csv', 'w')  # create a file for this user's data

# load up a list of 1000 common words
words = file('1-1000.txt').read().split()

ntrials = 50

answers = []
print """Type With Dominant Hand"""
for i in range(ntrials):
    word = random.choice(words)
    tstart = time.time()
    ans = raw_input('Please type ' + word + ': ')
    tstop = time.time()
    answers.append((word, ans, tstop - tstart))
    print >>outfile, 'Dominant', word, ans, tstop - tstart  # write the data to the file
    if (i % 5 == 3):
        go = raw_input('take a break, type y to continue: ')

print """Type With Nondominant Hand"""      
for i in range(ntrials):
    word = random.choice(words)
    tstart = time.time()
    ans = raw_input('Please type ' + word + ': ')
    tstop = time.time()
    answers.append((word, ans, tstop - tstart))
    print >>outfile, 'Nondominant', word, ans, tstop - tstart  # write the data to the file
    if (i % 5 == 3):
        go = raw_input('take a break, type y to continue: ')

 outfile.close()  # close the file

上記のスクリプトのサンプル結果:

Dominant sit sit 1.81511306763
Dominant again again 2.54711103439
Dominant from from 1.53057098389
Dominant general general 1.98939108849
Dominant horse horse 1.93938016891
Dominant of of 1.07597017288
Dominant clock clock 1.6587600708
Dominant save save 1.42030906677
Nondominant story story 3.92807888985
Nondominant of of 0.93910908699
Nondominant test test 1.69210004807
Nondominant low low 1.13296699524
Nondominant hit hit 1.15252614021
Nondominant you you 1.22019600868
Nondominant river river 1.42011594772
Nondominant middle middle 1.61595511436
4

3 に答える 3

1

numpy に慣れていない場合、これは別の言語のように思えるかもしれませんが、これを利用したソリューションを次に示します (ループがないことに注意してください!)。

テストのために、各エントリが 1 秒ずつ増加する 2 番目のユーザー データ ファイルを作成しました。

import glob
import numpy as np

usecols = [0, 3] # Columns to extract from data file
str2num = {'Dominant': 0, 'Nondominant': 1} # Conversion dictionary
converters = {0: (lambda s: str2num[s])} # Strings -> numbers

userfiles = glob.glob('*.csv')
userdat = np.array([np.loadtxt(f, usecols=usecols, converters=converters)
                    for f in userfiles])

# Create boolean arrays to filter desired results
dom    = userdat[..., 0] == 0 
nondom = userdat[..., 0] == 1 

# Filter and reshape to keep 'per-user' layout
usercnt, _, colcnt = userdat.shape
domdat    = userdat[dom   ].reshape(usercnt, -1, colcnt)
nondomdat = userdat[nondom].reshape(usercnt, -1, colcnt)

domavgs    = np.average(domdat,    axis=1)[:, 1]
nondomavgs = np.average(nondomdat, axis=1)[:, 1]

print 'Dominant averages by user:    ', domavgs
print 'Non-dominant averages by user:', nondomavgs

出力:

Dominant averages by user:     [ 1.74707571  2.74707571]
Non-dominant averages by user: [ 1.63763103  2.63763103]

多くの分析を行う場合は、numpy について理解することを強くお勧めします。

于 2012-11-30T00:43:31.277 に答える
0
persons = ["billy","bob","joe","kim"]
num_dom,total_dom,num_nondom,total_nondom=0,0,0,0
for person in persons:
   data = file('%s.csv' %person, 'r').readlines()
   for line in data:
      if "Nondominant" in line:
         num_nondom+=1
         total_nondom+=int(line.split(' ')[-1].strip())
      elif "Dominant" in line:
         num_dom+=1
         total_nondom+=int(line.split(' ')[-1].strip())
      else: continue
dom_avg = total_dom/num_dom
nondom_avg = total_nondom/num_nondom
print "Average speed with Dominant hand: %s" %dom_avg
print "Average speed with Non-Dominant hand: %s" %nondom_avg

「persons」配列に被験者の名前を入力してから、データで好きなことをしてください。

PS。Heltonbiker があなたのアイデアに注目し、追加しました。また、ストリップを追加して改行バグを修正しました。

于 2012-11-29T22:50:27.777 に答える
0
def avg_one(filename):
    vals = { 'Dominant': [], 'Nondominant': [] }
    for line in input:
        hand, _, _, t = split(line.strip())
        vals[hand].append(float(t))
    d = vals['Dominant']
    nd = vals['Nondominant']
    return (sum(d)/len(d), sum(nd)/len(nd))

data = []
for f in os.listdir():
    if f.endswith('.csv'):
        data.append(avg_one(f))

doms, nondoms = zip(data)

print "Dominant: " + repr(doms)
print "Nondominant: " + repr(nondoms)

これは、同じディレクトリに異なる形式の (そして解析に失敗する) 他の .csv ファイルがないことを前提としています。そして、これには一般的により多くのエラーチェックが必要ですが、アイデアは伝わります。

于 2012-11-29T22:53:02.980 に答える