为什么我用numpy实现的Merge合并函数返回异常结果?
问题解答
核心问题
你的代码错误来自两处逻辑缺失:
- 现有的
while循环仅在左右两个数组都还有未遍历元素时才执行写入操作,当其中一个数组遍历完成后,另一个数组剩余的元素没有被写入结果数组。你给出的调用案例中,右侧数组[1,2,3]遍历完成后循环直接终止,左侧的5,6,9完全没有被写入结果。 - 你使用
np.empty()初始化数组时,仅分配了对应长度的内存空间,不会自动填充默认值,未写入的位置会保留内存中的原始垃圾值,就是你返回结果里后三位的奇怪数字。
修复方案
在循环结束后、返回结果前,增加剩余元素的写入逻辑即可,修复后完整代码如下:
import numpy as np def Merge(leftlist, rightlist): len1 = len(leftlist) len2 = len(rightlist) lfirst = 0 rfirst = 0 merge = 0 newlist = np.empty(len1 + len2, dtype = int) while lfirst < len1 and rfirst < len2: if leftlist[lfirst] < rightlist[rfirst]: newlist[merge] = leftlist[lfirst] lfirst += 1 merge += 1 else: newlist[merge] = rightlist[rfirst] rfirst += 1 merge += 1 # 写入左侧数组剩余元素 newlist[merge:merge + len1 - lfirst] = leftlist[lfirst:] merge += len1 - lfirst # 写入右侧数组剩余元素 newlist[merge:] = rightlist[rfirst:] return newlist
调用Merge(np.array([5,6,9]), np.array([1,2,3]))即可返回预期结果array([1, 2, 3, 5, 6, 9])。
内容的提问来源于stack exchange,提问作者Apparent
相关产品推荐
相关产品推荐

