已关闭,该问题需要details or clarity,目前不接受回答。
**想要改进此问题?**通过editing this post添加详细信息并澄清问题。
4天前关闭。
Improve this question
我有两个数组:
data_array=[4.4, 7.2, 10.1, 1.1, 5.5, 8.3, 2.2, 6.2, 3.3, 9.1, 1.3]
test_array=[2, 5, 9, 4, 10, 8, 7, 3, 6, 1, 1]
所需输出:
[2.2, 5.5, 9.1, 4.4, 10.1, 8.3, 7.2, 3.3, 6.2, 1.1, 1.3]
也就是说,我需要以唯一的方式基于两个数组的每个元素的最小差异来排列data_array(意思是:在示例test_array中,值'1'存在两次,其与data_array的值的最小差值-〉0.1,因此输出数组中为1.1,但对于test_array中的第二个值'1',它应该取下一个最小差值-〉0.3,因此输出数组中为1.3)
这是一个例子。我想对长度更大的数组(以千/百万为单位)执行此操作
先谢谢你了
在MATLAB,Python或任何其他有效的媒介解决方案是赞赏!
def method1(A, B):
result = np.empty_like(A)
for i, val in tqdm(enumerate(A), desc="Processing", unit="iteration", unit_scale=True):
closest_idx = np.argmin(np.abs(B- val))
result[i] = B[closest_idx]
comp_arr = np.delete(B, closest_idx)
return result
#GPU execution - most efficient method found in stackoverflow!
@nb.njit('int_[:](float32[:],float32[:])', parallel=True)
def method2(A,B):
mB = B.shape[0]
output = np.empty(A.shape[0], dtype=np.int_)
# Parallel loop
for i in nb.prange(A.shape[0]):
rowA = A[i]
rowB = B
index_rowB = np.argsort(rowB)
sorted_rowB = rowB[index_rowB]
idxs = np.searchsorted(sorted_rowB, rowA)
left = np.fabs(rowA - sorted_rowB[np.maximum(idxs-1, 0)])
right = np.fabs(rowA - sorted_rowB[np.minimum(idxs, mB-1)])
prev_idx_is_less = (idxs == mB) | (left < right)
output[i] = index_rowB[idxs - prev_idx_is_less]
return output
这两种方法都需要数年的时间来执行我的数组的长度!!!
1条答案
按热度按时间dgiusagp1#
我想我明白了。如果我没有完全理解你的问题,很抱歉。
我的解决方案:
1.用测试数据创建数据框(通过索引保存test_array的原始顺序)
1.按测试数据对 Dataframe 进行排序
1.添加一个具有已排序data_array的列
1.对索引进行排序以获得test_array的原始顺序。
这假设最小的唯一差异与按秩配对数组相同。检查这对您的用例是否准确。鉴于其低复杂性,我希望这是快速的。
验证码: