假设我有两个数组:
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
(直到索引i
)。因此,c[:i] == a[:i]
必须返回True。c
由来自array的值填充,这些值b
尚未出现在array中c
,其顺序完全相同。鉴于索引i
被设置为2,对于上述阵列所需的输出a
和b
在所述代码应为:
> c
[[0, 1],
[2, 3],
[6, 7],
[4, 5]]
数组c
的长度必须与arrayb
和array的长度相同a
,并且arraya
或arrayb
中的两个元素可能相同。阵列c
还必须由那些在相同的元件的a
和b
,(即,它有些行为类似于洗牌)。
我尝试了多种解决方案,但没有一个能提供理想的结果。最接近的是:
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)))
但是,有时这会导致arrayc
小于arraya
和b
,因为任一列表中的元素有时可能会重复。
以下应正确处理重复项。
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)
它
a
和b
a
,即具有i
False和True的蒙版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]])
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句