2016-04-03 3 views
0

Идея состоит в том, что я студент, который просто берёт некоторые данные для некоторого эксперимента, и мне нужно представить его в таблице. Я использовал массив для хранения всех данных, которые вводят пользователи, но я ищу более эффективный способ представления моих данных.Как оптимизировать таблицу и реализовать для циклов

Вот мой код:

import numpy as np 
print 'Times, Average Times, Velocity' 
tteb=np.zeros((3,7)) 
pos=np.array([1000,950,850,700,500,250,0]) 
posp=pos*(5.16667*10**(-4)) 
for j in range (0,3): 
    k=j+1 
    print 'This is for trial %d' %k 
    for i in range (0,7): 
     print 'Input for band %d'%i  
     tteb[j,i]=float(raw_input('~')) 
print 'Trials 1-3 for all 7 bands.:' 
print tteb 
raw_input('Press [Enter] to continue to average time and *velocity *(later).') 

ttebatvsum=tteb.sum(axis=0) 
print 'This is all the times added together. (Bands 0--->6).' 
print ttebatvsum 
print 'This is the average for all of the times. (Bands 0--->6).' 
ttebatvmean=ttebatvsum/3 
print ttebatvmean 
raw_input('Press [Enter] to continue to velocity.') 
velocity=posp/ttebatvsum 
print 'Here are all the velocities. (Bands 0--->6).' 
print velocity 

#Table Starts here 
print 'Pos (ml) |Pos (m) | t1  |t2   | t3  |t(avg)  |v   |' 
print '%2.3f  |%4.3f  |%6.3f  |%8.3f  |%10.3f  |%12.3f  |%14.3f  |'%(pos[0],posp[0],tteb[0,0],tteb[1,0],tteb[2,0],ttebatvmean[0],velocity[0]) 
print '%2.3f  |%4.3f  |%6.3f  |%8.3f  |%10.3f  |%12.3f  |%14.3f  |'%(pos[1],posp[1],tteb[0,1],tteb[1,1],tteb[2,1],ttebatvmean[1],velocity[1]) 
print '%2.3f  |%4.3f  |%6.3f  |%8.3f  |%10.3f  |%12.3f  |%14.3f  |'%(pos[2],posp[2],tteb[0,2],tteb[1,2],tteb[2,2],ttebatvmean[2],velocity[2]) 
print '%2.3f  |%4.3f  |%6.3f  |%8.3f  |%10.3f  |%12.3f  |%14.3f  |'%(pos[3],posp[3],tteb[0,3],tteb[1,3],tteb[2,3],ttebatvmean[3],velocity[3]) 
print '%2.3f  |%4.3f  |%6.3f  |%8.3f  |%10.3f  |%12.3f  |%14.3f  |'%(pos[4],posp[4],tteb[0,4],tteb[1,4],tteb[2,4],ttebatvmean[4],velocity[4]) 
print '%2.3f  |%4.3f  |%6.3f  |%8.3f  |%10.3f  |%12.3f  |%14.3f  |'%(pos[5],posp[5],tteb[0,5],tteb[1,5],tteb[2,5],ttebatvmean[5],velocity[5]) 
print '%2.3f  |%4.3f  |%6.3f  |%8.3f  |%10.3f  |%12.3f  |%14.3f  |'%(pos[6],posp[6],tteb[0,6],tteb[1,6],tteb[2,6],ttebatvmean[6],velocity[6]) 

Идея заключается в том, чтобы использовать для петель в моем случае. Я хочу, чтобы число массивов идти с шагом 1

+0

BTW- Использование Python 2.7.11, с Anaconda2 – Looi

+0

Там являются модулями для отображения данных numpy, без необходимости писать отдельные инструкции 'print'. См. Http://stackoverflow.com/questions/9712085/numpy-pretty-print-tabular-data – Stuart

+0

@Stuart, спасибо, однако, за эту курсовую работу мне не разрешено рисковать на другие модули, кроме numpy, math, pylab и несколько других вещей – Looi

ответ

0

Посмотрите на набор линий:

print ...(pos[0],posp[0],tteb[0,0],tteb[1,0],tteb[2,0],ttebatvmean[0],velocity[0]) 
print ...(pos[1],posp[1],tteb[0,1],tteb[1,1],tteb[2,1],ttebatvmean[1],velocity[1]) 

Если бы мы имели переменную j, который начал с нуля, мы могли бы написать:

print ...(pos[j],posp[j],tteb[0,j],tteb[1,j],tteb[2,j],ttebatvmean[j],velocity[j]) 

Таким образом, мы можем положить, что в цикле:

for j in range(0,7): 
    print ...(pos[j],posp[j],tteb[0,j],tteb[1,j],tteb[2,j],ttebatvmean[j],velocity[j]) 

Однако, обратите внимание, что you can print without a newline (carriage return), поэтому вам не нужно делать tteb все на одной линии. На самом деле, вы можете сделать это:

for i in range(0,num_trials): 
    sys.stdout.write('|%8.3f  '%(tteb[i,j])) 

Полагая, что в:

for j in range(0,7): 
    sys.stdout.write('%2.3f  |%4.3f'%  (pos[j],posp[j]) 
    for i in range(0,num_trials): 
     sys.stdout.write('|%8.3f  '%(tteb[i,j])) 
    sys.stdout.write('|%12.3f  |%14.3f  |'%(ttebatvmean[j],velocity[j]) 
    sys.stdout.write('\n') #newline has to be printed manually for stdout 

Надеюсь, вы можете увидеть, что мы можем разорвать Записывая на более управляемые части, и использовать циклы в пределах линии, если это необходимо ,

NB: Я не уверен, что вы делаете с форматами печати там, формат должен быть чем-то вроде «% 8.3f», что означает 8 общих символов числа, с 3 цифрами точности в фиксированной точности формат. 8 не должны меняться, если вы не хотите больше или меньше цифр перед десятичной точкой.

0

Альтернативный способ сделать это - сформировать данные в таблицу в numpy и затем вывести все это. Вы также можете использовать format, чтобы лучше контролировать, как появляются строки.

# Put all the output data into one 2d array 
table = np.concatenate((np.stack((pos, posp)), tteb, np.stack((ttebatvmean, velocity)))) 

# Rotate and flip the table so it's oriented the right way for output 
table = np.flipud(np.rot90(table)) 

# Set output format 
heading = "{:>8s}|" + "{:>8s}|" * 6 
row = "{:>8.0f}|" + "{:>8.3f}|" * 6 

# Print headings and data 
print(heading.format("Pos (ml)", "Pos (m)", "t1", "t2", "t3", "t(avg)", "v")) 
for data_row in table: 
    print(row.format(*data_row)) 

Если вы не хотите, чтобы поместить все данные в один массив вы могли бы также zip массивы вместе для вывода:

tteb_rotated = np.flipud(np.rot90(tteb)) 
for p, pp, (t1, t2, t3), tavg, v in zip(pos, posp, tteb_rotated, ttebatvmean, velocity): 
    print(row.format(p, pp, t1, t2, t3, tavg, v)) 
Смежные вопросы