Python:在numpy中比较列
我正在编写一个程序,通过add_to_file函数创建一个文件,然后另一个程序将该文件作为输入 文件有4列:名称、开始位置、说明、结束位置 程序应该做的是将文件读入一个numpy数组,并通过创建一个数组来创建合理的“运动序列”,该数组在运动中至少有一个结束位置与随后运动中的至少一个开始位置相同Python:在numpy中比较列,python,arrays,function,numpy,iteration,Python,Arrays,Function,Numpy,Iteration,我正在编写一个程序,通过add_to_file函数创建一个文件,然后另一个程序将该文件作为输入 文件有4列:名称、开始位置、说明、结束位置 程序应该做的是将文件读入一个numpy数组,并通过创建一个数组来创建合理的“运动序列”,该数组在运动中至少有一个结束位置与随后运动中的至少一个开始位置相同 def make_sequence(size,array): count = 0 sequence = [array[0]] result = [array[0,0]] f
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
这样做的目的是,它从文件中提取数组,并生成一个新数组(结果),这样新数组只包含运动的名称,但只有相邻的运动才会流动,因为它们的起始位置与先前运动的结束位置完全相同!这是我的问题:
有些动作可以在不同的位置开始和结束,我所写的每一个动作只能有一个开始和一个结束位置
问题:如果位置值的字符串是逗号分隔的值,即(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]
之所以获得此输出,是因为它会自动从名为“Name1”的行_1开始,然后读取下一行,如果该行的起始位置与追加到正确序列的前一行的结束位置相同,则其名称将追加到结果数组中
它只对前7行执行此操作,因为输入的大小为7。一个是关于数据处理:如何从原始数据文件中提取所需信息。您需要的是名称(第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']
如果没有示例输入和预期输出,您的问题就没有任何意义。我对其进行了编辑,现在有意义了吗?