2013-04-19 2 views
-1

Я пишу программу, которая создает файл с помощью функции add_to_file, а затем другая программа принимает этот файл в качестве ввода.Python: сравнение столбцов в numpy

файл имеет 4 колонки: имя, начальную позицию (ы), описание, конечное положение (ы)

, что программа должна делать, читать файл в Numpy массив и создать правдоподобную «движение слэш», по существу, создавая массив, который будет иметь по крайней мере один из конечных положений в движении, чтобы быть таким же, как, по меньшей мере, одно из положений пуска в движении, которое будет следовать

def make_sequence(size,array): 
    count = 0 
    sequence = [array[0]] 
    result = [array[0,0]] 
    for row in array[1:size]: 
     if row[1] == sequence[count][3]: 
      sequence.append(row) 
      result.append(row[0]) 
      count += 1 
     else: 
      pass 
    return result 

что это делает , это взятие массива из файла и создание нового массива (результата), так что новый массив просто имена движений, но только движения что рядом с eachother будет течь, потому что их начальные позиции точно такие же, как конечные позиции предыдущего движения! Вот мой вопрос:

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

Вопрос: Как я могу сделать так, что если строка для значений позиции были запятая разделяет значения, то есть (а, б, в, г), он будет иметь возможность перебирать их и сравнить их с самого начала для завершения, чтобы функция вернула все движения, которые текут?

Edit:

Вот пример того, что я хочу, чтобы мой код, чтобы быть в состоянии сделать

вход:

row_1 = ["Name1", "1,3,4,5", "Description", "2"] 
row_2 = ["Name2", "5,3", "Description", "4"] 
row_3 = ["Name3", "2", "Description", "1"] 
row_4 = ["Name4", "1", "Description", "7,3"] 
row_5 = ["Name5", "3", "Description", "5,9,4"] 
row_6 = ["Name6", "2", "Description", "7"] 
row_7 = ["Name7", "7", "Description", "2"] 
row_8 = ["Name8", "1", "Description", "4"] 
row_9 = ["Name9", "4", "Description", "2"] 
data = np.array((column_index,row_1,row_2,row_3,row_4,row_5,row_6,row_7,row_8,row_9)) 
print make_sequence(7,array) 

выход:

[Name1,Name3,Name4,Name5] 

Вы получаете это вывод, потому что он запускается автоматически с row_1, который имеет имя: «Name1», затем он читает следующую строку и i f, что строка имеет начальную позицию, которая совпадает с конечной позицией, как предыдущая строка, добавленная к правильной последовательности, это имя будет добавлено к массиву результатов.

И он делает это только в течение первых 7 рядов, так как вход был 7 для размера

+0

Ваш вопрос не имеет никакого смысла без ввода пробы и то, что ваш ожидаемый результат должен быть. –

+0

Я отредактировал его как таковой, теперь имеет смысл? –

ответ

1

Ну, есть два вопроса. Один из них касается обработки данных: как извлечь требуемую информацию из файла необработанных данных. Вам нужны имена (столбец 0), начальная позиция (первый элемент столбца 1) и конечные позиции (последний элемент столбца 3). Это может выглядеть так:

import numpy as np 

dat = np.array([["Name1", "1,3,4,5", "Description", "2"], 
    ["Name2", "5,3", "Description", "4"], 
    ["Name3", "2", "Description", "1"], 
    ["Name4", "1", "Description", "7,3"], 
    ["Name5", "3", "Description", "5,9,4"], 
    ["Name6", "2", "Description", "7"], 
    ["Name7", "7", "Description", "2"], 
    ["Name8", "1", "Description", "4"], 
    ["Name9", "4", "Description", "2"]]) 

#since you only want the 7 initial columns 
dat = dat[0:7,:] 

#extract second and fourth columns 
c1 = dat[:,1] 
c2 = dat[:,3] 
names = dat[:,0] 

#get the start position via string manipulation 
startpos = [] 
for item in c1: 
    startpos.append(item.split(',')[0]) 

startpos = np.array(startpos).astype(np.int32) 

#get the end position via string manipulation 
endpos = [] 
for item in c2: 
    endpos.append(item.split(',')[-1]) 

endpos = np.array(endpos).astype(np.int32) 
print startpos 
print endpos 

Cool. Теперь вам просто нужно следовать StartPos и ​​endpos, например, так:

def followpath(a1,a2): 
    needle = 1 
    path = [] 
    for ii,item,newneedle in zip(np.arange(a1.size)+1,a1,a2): 
     if item == needle: 
      path.append(ii) 
      needle = newneedle 
    return np.array(path) - 1 

thepath = followpath(startpos,endpos) 
print names[thepath] 

Это дает мне:

['Name1' 'Name3' 'Name4' 'Name5'] 
Смежные вопросы