Numpy选择:形状不匹配错误

时间:2018-03-27 11:19:37

标签: python numpy

我希望在两对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]

提前致谢!

2 个答案:

答案 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:]

稍微长一点的解释:

从数组ab,您可以创建返回数组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。