Python Numpy choose:形状不匹配错误

Python Numpy choose:形状不匹配错误,python,numpy,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_

例如,我希望在两对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的形状
[宽度、高度]
),这会产生错误
值错误:形状不匹配:对象无法广播到单个形状
。下面是一个玩具示例,给出了相同的错误:

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\u next、b和b\u next的形状相同
[M、宽度、高度]


提前谢谢

在第一个轴上使用布尔索引。以下

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)
给予

因为在这种情况下,

ind = [ True False False  True]

tl;dr:您可以将感兴趣的数组串联起来,然后将它们洗牌并切片:

c = np.concatenate((a, b))
np.random.shuffle(c)
x, y = c[:N], c[N:]
稍长的解释:


从数组
a
b
中,您可以创建
c=np.concatenate((a,b))
,它返回数组
c=np.array([a1,a2,a3,a4,b1,b2,b3,b4])
,然后使用函数
np random.shuffle(c)
将其洗牌到位。现在c看起来像
c=np.array([a3,b1,a2,b2,a4,a1,b3,b4])
。最后,您可以通过将c分为两部分来创建数组x和y。假设您要创建的数组x的长度为Nx=c[:N]
创建数组x,通过
y=c[N://code>

创建数组y,我考虑过这一点,但是使用布尔数组我可以在“a或无”和“b或无”之间进行选择,但我想选择“a或b”。有没有办法用布尔数组来实现这一点?你说得对!我也没有想过在作业的左侧使用布尔索引。谢谢实际上,在您的代码中,x和y始终包含来自a的2个元素和来自b的2个元素。但是,您没有提到这是一项要求。请注意,我提出的解决方案并不能保证这一点。
c = np.concatenate((a, b))
np.random.shuffle(c)
x, y = c[:N], c[N:]