我希望在两对numpy数组之间进行混洗,例如给定
a = [a1,a2,a3,a4]
a_next = [a2,a3,a4,a5]
b = [b1,b2,b3,b4]
b_next [b2,b3,b4,b5]
我想在a和b之间进行洗牌以获得
x = [a1,b2,b3,a4]
x_next = [a2,b3,b4,a5]
y = [b1,a2,a3,b4]
y_next = [b2,a3,a4,b5]
我已经设法使用以下方法使单维a和b工作:
a = np.array([11,22,33,44])
a_next = np.array([22,33,44,55])
b = np.array([10,20,30,40])
b_next = np.array([20,30,40,50])
choices = [a,b]
choices_next = [a_next,b_next]
alternating_indices = np.random.randint(0, 2, len(a)) # Random 0s or 1s
x = np.choose(alternating_indices, choices)
x_next = np.choose(alternating_indices, choices_next)
y = np.choose(1-alternating_indices, choices)
y_next = np.choose(1-alternating_indices, choices_next)
但是我的真实a和b实际上是3D数组(因此a1,a2,...,b1,b2的形状为[width, height]
),这会产生错误ValueError: shape mismatch: objects cannot be broadcast to a single shape
。这是一个给出相同错误的玩具示例:
a = np.array([[11,11],[22,22],[33,33],[44,44]])
a_next = np.array([[22,22],[33,33],[44,44],[55,55]])
b = np.array([[10,10],[20,20],[30,30],[40,40]])
b_next = np.array([[20,20],[30,30],[40,40],[50,50]])
那么,我怎样才能使这个工作适用于具有非平凡形状元素的数组?实数阵列a,a_next,b和b_next具有相同的形状[M, width, height]
。
提前致谢!
答案 0 :(得分:2)
在第一个轴上使用布尔索引。以下
import numpy as np
a = np.array([[11,11],[22,22],[33,33],[44,44]])
b = np.array([[10,10],[20,20],[30,30],[40,40]])
ind = np.random.randint(0, 2, len(a), dtype=np.bool)
a[ind,...], b[ind,...] = b[ind,...], a[ind,...]
print(a)
print(b)
给出
[[10 10]
[22 22]
[33 33]
[40 40]]
[[11 11]
[20 20]
[30 30]
[44 44]]
,在这种情况下,
ind = [ True False False True]
答案 1 :(得分:0)
tl; dr:你可以连接你感兴趣的数组,然后将它们洗牌并切片:
c = np.concatenate((a, b))
np.random.shuffle(c)
x, y = c[:N], c[N:]
稍微长一点的解释:
从数组a
和b
,您可以创建返回数组c = np.concatenate((a, b))
的{{1}},然后使用函数c = np.array([a1, a2, a3, a4, b1, b2, b3, b4])
将其随机播放。现在c看起来像np.random.shuffle(c)
。最后,您可以通过将c切成两部分来创建数组x和y。假设您要创建的数组x的长度为N <1。 M,可以使用c = np.array([a3, b1, a2, b2, a4, a1, b3, b4])
和x = c[:N]
创建数组x。