【发布时间】:2018-10-29 14:11:07
【问题描述】:
我想计算一个数组 A 中的所有元素与另一个数组 B 中的所有元素之间的差异的直方图。
所以我想要以下数据的直方图:
Delta1 = A1-B1
Delta2 = A1-B2
Delta3 = A1-B3
...
DeltaN = A2-B1
DeltaN+1 = A2-B2
DeltaN+2 = A2-B3
...
这个计算的重点是表明这些数据具有相关性,即使不是每个数据点在另一个数组中都有一个“伙伴”,并且在实践中相关性相当嘈杂。
问题在于这些文件实际上非常大,几 GB,并且向量的所有条目都是 64 位整数,差异非常大。 对我来说,将这些数据转换为二进制数组以便能够使用相关函数和傅立叶变换来计算它似乎是不可行的。
这是一个小示例,可以让您更好地了解我正在查看的内容。 这种在 for 循环中进行 numpy 搜索排序的实现相当慢。
import numpy as np
import matplotlib.pyplot as plt
timetagsA = [668656283,974986989,1294941174,1364697327,\
1478796061,1525549542,1715828978,2080480431,2175456303,2921498771,3671218524,\
4186901001,4444689281,5087334517,5467644990,5836391057,6249837363,6368090967,8344821453,\
8933832044,9731229532]
timetagsB = [13455,1294941188,1715828990,2921498781,5087334530,5087334733,6368090978,9731229545,9731229800,9731249954]
max_delta_t = 500
nbins = 10000
histo=np.zeros((nbins,2), dtype = float)
histo[:,0]=np.arange(0,nbins)
for i in range(0,int(len(timetagsA))):
delta_t = 0
j = np.searchsorted(timetagsB,timetagsA[i])
while (np.round(delta_t) < max_delta_t and j<len(timetagsB)):
delta_t = timetagsB[j] - timetagsA[i]
if(delta_t<max_delta_t):
histo[int(delta_t),1]+=1
j = j+1
plt.plot(histo[0:50,1])
plt.show()
如果有人可以帮助我找到一种更快的计算方法,那就太好了。提前致谢!
【问题讨论】:
标签: python numpy histogram sparse-matrix