matlab 基于另一个数组的数组排序[已关闭]

mnemlml8  于 2023-04-21  发布在  Matlab
关注(0)|答案(1)|浏览(178)

已关闭,该问题需要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

这两种方法都需要数年的时间来执行我的数组的长度!!!

dgiusagp

dgiusagp1#

我想我明白了。如果我没有完全理解你的问题,很抱歉。
我的解决方案:
1.用测试数据创建数据框(通过索引保存test_array的原始顺序)
1.按测试数据对 Dataframe 进行排序
1.添加一个具有已排序data_array的列
1.对索引进行排序以获得test_array的原始顺序。
这假设最小的唯一差异与按秩配对数组相同。检查这对您的用例是否准确。鉴于其低复杂性,我希望这是快速的。
验证码:

import pandas as pd
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]

df = pd.DataFrame(data={'test':test_array})
df.sort_values(by='test',inplace=True)
df['data']=sorted(data_array)
df.sort_index(inplace=True)
df['data']

#output: 2.2, 5.5, 9.1, 4.4, 10.1, 8.3, 7.2, 3.3, 6.2, 1.1, 1.3

相关问题