我正在尝试计算索引以在大量数据中找到感兴趣的区域。这样,我可以在适当的索引处使用切片表示法来获得快速性能。我最初尝试使用.count()
方法,但我现在正在尝试使用字典模块。例如,我创建了一个txt文件并获取了值的出现次数。如何使用它来计算感兴趣范围内的指数?
简单示例:
txt文件包含以下数据。
1 100 1
1 101 2
1 102 3
2 103 4
2 104 5
3 105 6
3 106 7
3 107 8
3 108 9
4 109 10
5 110 11
我使用下面的两个函数来读取文件并将数据组织到适当的列表中。
def get_list_from_int(lines, col_number):
list = []
for col in lines:
datum = col.split()
list.append(float(datum[col_number]))
return list
def read_data(filename): # filename = "User/Desktop/fileloc/filename.txt"
lines = list(open(filename, 'r'))
xs = get_list_from_int(lines, 0) # column 1
ys = get_list_from_int(lines, 1) # column 2
zs = get_list_from_int(lines, 2) # column 3
return xs, ys, zs
然后我通过Counter
模块使用collections
。
X = Counter(xs)
print(X)
>> Counter({3.0: 4, 1.0: 3, 2.0: 2, 4.0: 1, 5.0: 1})
问题:
假设我想要3 ≤ xs ≤ 4
的索引。我可以应用切片表示法来获得相应ys
和zs
的相同索引。如何获得大于或等于3但小于或等于4的键的值之和?理想情况下,获得的结果为[6, 10]
,但[6, 7, 8, 9, 10]
也可以。
原创方法(值得放弃?):
我最初的方法是使用define一个函数来计算从列表的第一个元素到感兴趣范围的第一个元素的索引,然后继续计数直到感兴趣的范围中的最后一个元素;该函数将使用start += data_list.count(index) for index in range(1, boundary_1)
和end += data_list.count(index) for index in range(boundary_1, boundary_2+1)
将感兴趣范围的边界元素作为输入,但我无法使函数正常工作。
答案 0 :(得分:0)
def choose_slice(start, end, xs):
# subfunction called by get_slice() -- defined below
go, stop = 0, 0
cx = sorted(Counter(xs).items()) # sort to count consecutively
for val, key in cx:
if val < start:
go += key # match index at boundary of region of interest
# print("count = %d" %key, "value = %.2f" %val)
elif val >= start and val <= end:
stop += key # inbetweeen the boundaries, in the region of interest
# print("count = %d" %key, "value = %.2f" %val)
elif val > end: # match index at boundary of region of interest
break
stop = go + stop
return go, stop
def get_slice(start, end, xs=xs, ys=ys, zs=zs):
go, stop = choose_slice(start, end, xs) # get indices
return xs[go:stop], ys[go:stop], zs[go:stop] # get values at indices
xx, yy, zz = get_slice(3, 4)
print(xx)
>> [3.0, 3.0, 3.0, 3.0, 4.0]
这适用于我的数据集大小~10 ^ 4。但我仍然对其他方法感到好奇。