EDIT
Приведенное ниже решение предполагает, что ваши данные настолько велики, что вы не можете использовать np.substract
с np.outer
, а затем нарезаете значение, которое хотите сохранить:
arr_diff = np.subtract.outer(arrB, arrA)
print (arr_diff[(0<arr_diff ) &(arr_diff <max_delta_t)])
# array([ 14, 12, 10, 13, 216, 11, 13, 268], dtype=int64)
с данными вашего примера это работает, но не с слишком большим набором данных
ОРИГИНАЛЬНОЕ РЕШЕНИЕ
Давайте сначала предположим, что ваш max_delta_t
меньше разницы между двумя последовательными значениями в timetagsB
для простого способа сделать это (тогда мы можем попытаться обобщить его).
#create the array instead of list
arrA = np.array(timetagsA)
arrB = np.array(timetagsB)
max_delta_t = np.diff(arrB).min() - 1 #here it's 202 just for the explanation
Вы можете использовать np.searchsorted
векторизованным способом:
# create the array of search
arr_search = np.searchsorted(arrB, arrA) # the position of each element of arrA in arrB
print (arr_search)
# array([1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 6, 6, 6, 6, 7, 7, 7],dtype=int64)
Вы можете вычислить разницу между элементом arrB
, соответствующим каждому элементу arrA
, нарезав arrB
с помощью arr_search
# calculate the difference
arr_diff = arrB[arr_search] - arrA
print (arr_diff[arr_diff<max_delta_t]) # finc the one smaller than max_delta_t
# array([14, 12, 10, 13, 11, 13], dtype=int64)
Итак, то, что вы ищете, рассчитывается как np.bincount
arr_bins = np.bincount(arr_diff[arr_diff<max_delta_t])
#to make it look like histo but not especially necessary
histo = np.array([range(len(arr_bins)),arr_bins]).T
Теперь проблема в том, что есть некоторые значения разности между arrA
и arrB
, которые не могут быть получены с помощью этого метода, когда max_delta_t
больше, чем два последовательных значения в arrB
. Вот один из способов, возможно, не самый эффективный в зависимости от значений ваших данных. Для любого значения max_delta_t
#need an array with the number of elements in arrB for each element of arrA
# within a max_delta_t range
arr_diff_search = np.searchsorted(arrB, arrA + max_delta_t)- np.searchsorted(arrB, arrA)
#do a loop to calculate all the values you are interested in
list_arr = []
for i in range(arr_diff_search.max()+1):
arr_diff = arrB[(arr_search+i)%len(arrB)][(arr_diff_search>=i)] - arrA[(arr_diff_search>=i)]
list_arr.append(arr_diff[(0<arr_diff)&(arr_diff<max_delta_t)])
Теперь вы можете np.concatenate
list_arr и использовать np.bincount
, например:
arr_bins = np.bincount(np.concatenate(list_arr))
histo = np.array([range(len(arr_bins)),arr_bins]).T