numpy:如何将两个排序数组合并为一个更大的排序数组?

Gul*_*zar 3 python sorting numpy

我有两个排序的 np.arrays,说

1, 2, 3, 5
Run Code Online (Sandbox Code Playgroud)

2, 4, 6, 7
Run Code Online (Sandbox Code Playgroud)

我想要

1 2 2 3 4 5 6 7
Run Code Online (Sandbox Code Playgroud)

不想要 python for 循环。

是否有一些 numpy 功能?


奖励:按某些轴对矩阵执行此操作(其他轴具有相同的形状)

Ani*_*166 5

导入 sortednp 就可以了:

import numpy as np
import sortednp as s

a = np.array([1,2,3,5])
b = np.array([2,4,6,7])

m = s.merge(a, b)
print(m)
Run Code Online (Sandbox Code Playgroud)


Div*_*kar 5

滥用输入数组的排序性质,我们可以使用np.searchsorted,如下所示 -

\n\n
def merge_sorted_arrays(a, b):\n    m,n = len(a), len(b)\n    # Get searchsorted indices\n    idx = np.searchsorted(a,b)\n\n    # Offset each searchsorted indices with ranged array to get new positions\n    # of b in output array\n    b_pos = np.arange(n) + idx\n\n    l = m+n\n    mask = np.ones(l,dtype=bool)\n    out = np.empty(l,dtype=np.result_type(a,b))\n    mask[b_pos] = False\n    out[b_pos] = b\n    out[mask] = a\n    return out\n
Run Code Online (Sandbox Code Playgroud)\n\n

示例运行(使用重复项的一般情况)-

\n\n
In [52]: a\nOut[52]: array([1, 2, 3, 3, 5, 9, 9, 9])\n\nIn [53]: b\nOut[53]: array([ 2,  4,  6,  6,  6,  7, 10])\n\nIn [54]: merge_sorted_arrays(a, b)\nOut[54]: array([ 1,  2,  2,  3,  3,  4,  5,  6,  6,  6,  7,  9,  9,  9, 10])\n
Run Code Online (Sandbox Code Playgroud)\n\n

随机排序1000000大小的数组上的 Timimgs -

\n\n

针对流行的连接+排序方法进行基准测试。

\n\n
# Setup\nIn [141]: np.random.seed(0)\n     ...: a = np.sort(np.random.randint(0,1000000,(1000000)))\n     ...: b = np.sort(np.random.randint(0,1000000,(1000000)))\n\n# @chmod777's soln\nIn [142]: %%timeit\n     ...: c = np.concatenate((a,b), axis=0)\n     ...: c.sort()\n141 ms \xc2\xb1 2.13 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 10 loops each)\n\nIn [143]: %timeit merge_sorted_arrays(a, b)\n55.1 ms \xc2\xb1 5.1 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 10 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n

  • 像[这个答案](/sf/answers/869934341/)中那样显式使用合并排序很大程度上提高了连接排序方法的性能。我的基准数字:连接排序,默认类型:137ms;连接排序、合并排序类型:14.8ms;这个答案:57.6ms;[sortednp 合并](/sf/answers/4148428021/):9.65ms。 (2认同)