【问题标题】:Combining two sorted arrays to form a new array of the same length将两个排序后的数组组合成一个长度相同的新数组
【发布时间】:2021-03-19 03:58:05
【问题描述】:

我有两个固定长度 N 的数组。然后我想使用相同的阈值随机切割这两个数组。然后我想将第一个数组的第一部分粘合到第二个数组的第二部分。这个新数组的大小仍应与原始数组相同。

如果我的解释不清楚,请考虑以下示例:

我们有以下两个数组

arr1 = [1,3,5,7,8,10]
arr2 = [2,4,5,7,8,11]

如果我选择 4 作为阈值,这将给出以下新数组

result = [1,3,4,5,7,8,11]

这显然与原始数组的大小不同。但是,如果我们选择 6 作为阈值,我们会得到

result = [1,3,5,7,8,11]

具有所需大小。由于我将经常在相当大的数组上进行此计算,因此我想知道最有效的方法。我正在用 python 写这个,因此更喜欢使用 numpy 方法的答案。

【问题讨论】:

  • 如果长度是奇数,你将如何确定从arr1arr2 中选择多少?
  • 看起来您希望解决方案足够动态,以决定从每个数组 arr1arr2 中选择多少,使其与目标数组的长度相匹配。明白了。
  • 合并两个数组,创建一个集合,升序排序,然后选择值直到索引 = 数组长度
  • 你的数组总是排序的吗?
  • 是的,它们总是被排序的。但这只是为了确保我可以根据阈值对它们进行分区。我只希望第一个数组中的元素小于某个值,而第二个数组中的元素大于该值。阈值本身并不重要,但如果可能有多个,我更喜欢将两个数组尽可能地分成两半的那个。

标签: python numpy


【解决方案1】:

这是一个想法:

# find the first index that arr1[idx] >= arr2[idx]
idx = np.argmax(np.array(arr1) >= arr2)

# for every i < idx <= j
# arr1[i] < arr2[i] < arr2[j]
# so the output is increasing
np.concatenate([arr1[:idx], arr2[idx:]])

输出:

array([ 1,  3,  5,  7,  8, 11])

如果你对阈值感兴趣,那就是arr2[idx],注意idx == len(arr1) 的情况。

【讨论】:

  • 这似乎总是选择第一个可能发生剪切的索引。因此,虽然这确实满足了我的问题,但如果我能将它们尽可能地减少一半会更好。知道如何为此修改代码吗?
  • 你可以从那个索引开始做一个for循环,看看你能把它推回多远。那样的话,它 O(n) 所以还不错。
  • 谢谢,我想我现在有了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 2018-06-28
  • 1970-01-01
相关资源
最近更新 更多