我对Python不是很熟悉,但是我需要做一些事情。我有一个ASCII文件(空格分隔)的几列。在第一列中,有些值是重复的。例如,从这些重复值中,我需要选择第3列中具有较大值的行,然后返回一个数组。 我想要这样的东西:
#col1 col2 col3 col4 col5
1 1 2 3 4
1 2 1 5 3
2 2 5 2 1
将返回第1行和第3行。 到目前为止,我已经做到了:我定义了一个辅助函数来检测重复项的索引(所有第二个条目)
def list_duplicates(seq):
seen = set()
seen_add = seen.add
return [idx for idx,item in enumerate(seq) if item in seen or seen_add(item)]
然后尝试用它来读取列表(我从一个文件中加载的)np.genfromtxt文件命名(每列)
def select_high(ndarray, dup_col, sel_col): #dup_col is the column where the duplicates are, sel_col is the column where we select the larger value
result = []
dup = list_duplicates(ndarray[dup_col])
dupdup = [x-1 for x in dup]
for i in range(len(ndarray[sel_col])):
if i in dup:
mid = []
maxi = max(ndarray[sel_col][i], ndarray[sel_col][i-1])
maxi_index = np.where(ndarray[sel_col] == maxi)[0][0]
for name in ndarray.dtype.names:
mid.append(ndarray[name][maxi_index])
result.append(mid)
else:
mid = []
if i not in dupdup:
for name in ndarray.dtype.names:
mid.append(ndarray[name][i])
result.append(mid)
return np.asarray(result)
但是发生的事情是,每当有重复的时候,我就必须删除else
部分,否则它会给我一个错误,每当没有重复的时候,我就必须把它放回去。
感谢您的帮助,很抱歉发了这么长的帖子,希望我能说清楚
我想你(我也是)都沉浸在细节中了。以下是一个版本,它可以满足您的需要,但更简单:
第一行将
m
定义为从文件中获得的行列表。你知道吗第二行按第一列中的值(
r[0]
)对这些行排序,然后按第三列中的值排序,但从大到小(-r[2]
):现在,当您至少看到第一列中的值一次时,需要跳过这些行。我们使用一个集合
seen
来存储我们已经看到的r[0]
值。如果r[0]
不在seen
中,我们应该保留该行并将其放入seen
,这样我们下次看到r[0]
时就会丢弃该行。这有点棘手:请注意,
not seen.add(r[0])
始终为真,因为seen.add
返回None
。因此:如果
r[0]
不在seen
中,我们将r[0]
放在seen
中并保留该行如果
r[0]
在seen
中,则返回false并丢弃该行。你也可以这样表达:
相关问题 更多 >
编程相关推荐