gpt4 book ai didi

python - numpy 二维数组组合

转载 作者:太空宇宙 更新时间:2023-11-04 09:31:52 25 4
gpt4 key购买 nike

假设我有两个数组:

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

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

如您所见,一个数组只是另一个数组的洗牌。我需要将这两个数组组合起来形成第三个数组c,例如:

  • 数组 c 的第一部分(直到随机索引 i)由数组 a 的第一部分(直到索引)。因此,c[:i] == a[:i] 必须返回 True。
  • 数组 c 的其余部分由数组 b 中的值填充,这些值不在数组 c 中,完全相同它们出现的顺序。

鉴于索引 i设置为 2,上述数组 ab 的期望输出在代码应该是:

> c
[[0, 1],
[2, 3],
[6, 7],
[4, 5]]

数组 c 的长度必须与数组 b 和数组 a 的长度相同,并且其中的两个元素有可能数组 a 或数组 b 是一样的。数组 c 还必须包含 ab 中相同的元素(即它的行为有点像随机播放)。

我尝试了多种解决方案,但没有一个能给出预期的结果。最接近的是:

a = np.arange(10).reshape(5, 2)
np.random.shuffle(a)

b = np.arange(10).reshape(5, 2)
b_part = b[:4]

temp = []

for part in a:
if part in b_part:
continue
else:
temp.append(part)

temp = np.array(temp)

c = copy.deepcopy(np.vstack((b_part, temp)))

但是,它有时会导致数组 c 小于数组 ab,因为这两个列表中的元素有时会重复。

最佳答案

以下内容应该可以正确处理重复项。

def mix(a, b, i):                                             
sa, sb = map(np.lexsort, (a.T, b.T))
mb = np.empty(len(a), '?')
mb[sb] = np.arange(2, dtype='?').repeat((i, len(a)-i))[sa]
return np.concatenate([a[:i], b[mb]], 0)

  • 间接排序ab
  • 创建一个掩码,在不是从 a 获取的位置为 True,即有 i Falses 然后 len(a)-i是的。
  • 使用排序顺序将该掩码映射到 b
  • 使用掩码过滤 b 并附加到 a[:i]

示例(转置以节省空间):

a.T
# array([[2, 2, 0, 2, 3, 0, 2, 0, 0, 1],
# [0, 1, 2, 0, 1, 0, 3, 0, 0, 0]])
b.T
# array([[0, 0, 2, 1, 0, 0, 2, 2, 2, 3],
# [0, 0, 0, 0, 2, 0, 1, 3, 0, 1]])
mix(a, b, 6).T
# array([[2, 2, 0, 2, 3, 0, 0, 1, 0, 2],
# [0, 1, 2, 0, 1, 0, 0, 0, 0, 3]])

关于python - numpy 二维数组组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55425590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com