-1

我正在编写一个程序,它通过 add_to_file 函数创建一个文件,然后另一个程序将该文件作为输入。

该文件有 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

这是在做什么,它是从文件中获取数组并创建一个新数组(结果),这样新数组只是动作的名称,但只有彼此相邻的动作才会流动,因为它们的起始位置是准确的与前一动作的结束位置相同!这是我的问题:

有些动作可以在多种位置开始和结束,而我所写的每个动作只能取 1 个开始和 1 个结束位置。

问题:我怎样才能做到这一点,如果位置值的字符串是逗号分隔值,即(a,b,c,d),它将能够遍历它们并从头到尾比较它们,以便函数会返回所有流动的运动吗?

编辑:

这是我希望我的代码能够执行的操作的示例

输入:

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”,然后它读取下一行,如果该行的起始位置与附加到上一行的结束位置相同正确的序列,它的名称将被附加到结果数组中。

它只对前 7 行执行此操作,因为输入的大小为 7

4

1 回答 1

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

凉爽的。现在你只需要关注 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']
于 2013-04-19T22:04:06.843 回答