Numpy广播到第四维度:。。。对:对无
在montecarlo模拟中,我有以下7张扑克牌供2名玩家和3次不同的montecarlo跑步 自助卡:Numpy广播到第四维度:。。。对:对无,numpy,array-broadcasting,Numpy,Array Broadcasting,在montecarlo模拟中,我有以下7张扑克牌供2名玩家和3次不同的montecarlo跑步 自助卡: array([[[ 6., 12.], [ 1., 6.], [ 3., 3.], [ 8., 8.], [ 1., 1.], [ 4., 4.], [ 2., 2.]], [[ 6., 7.], [ 1., 1.], [ 3., 3.], [ 2.,
array([[[ 6., 12.],
[ 1., 6.],
[ 3., 3.],
[ 8., 8.],
[ 1., 1.],
[ 4., 4.],
[ 2., 2.]],
[[ 6., 7.],
[ 1., 1.],
[ 3., 3.],
[ 2., 2.],
[ 12., 12.],
[ 5., 5.],
[ 10., 10.]],
[[ 6., 3.],
[ 1., 11.],
[ 2., 2.],
[ 6., 6.],
[ 12., 12.],
[ 6., 6.],
[ 7., 7.]]])
相应的诉讼为:
西服
array([[[ 2., 1.],
[ 1., 2.],
[ 2., 2.],
[ 2., 2.],
[ 1., 1.],
[ 2., 2.],
[ 2., 2.]],
[[ 2., 0.],
[ 1., 3.],
[ 2., 2.],
[ 0., 0.],
[ 1., 1.],
[ 1., 1.],
[ 1., 1.]],
[[ 2., 2.],
[ 1., 0.],
[ 3., 3.],
[ 2., 2.],
[ 1., 1.],
[ 1., 1.],
[ 1., 1.]]])
现在,我想以一种方式“合并”数组,即将卡片数组扩展到第四维,大小为4:0,其中包含所有套装==1、1所有套装==2、2所有套装==3和3所有套装==4
我可以轻松创建4个不同的阵列:
club_cards=(self.suits == 1) * self.cards
diamond_cards=(self.suits == 2) * self.cards
heart_cards=(self.suits == 3) * self.cards
spade_cards=(self.suits == 4) * self.cards
然后将它们堆叠在一起:
stacked_array=np.stack((club_cards,diamond_cards, heart_cards, spade_cards),axis=0)
预期结果的形状为(4,3,8,2)
虽然这在上述情况下可能有意义,但并不总是可能的,特别是如果有超过4个案例需要堆叠在一起,这就引出了我的问题:
我怎样才能通过广播做到这一点?以下是我的具体问题:
我试过一些东西
self.suites[…,:,:,:]==np.arange(4)
?相反,下面的方法似乎几乎有效:self.suits[:,:,:,None]==np.arange(4)
(除了在错误的位置添加维度)。以下内容也不起作用:self.suits[None,:,:,:,:]==np.arange(4)
。如何在第一维度扩展数组,使结果与上面堆栈中的结果相同…
以及无
时?我希望使用…
,因为这将表示需要根据需要扩展此维度(在本例中为4的大小)?为什么这似乎是不正确的,而使用了None您正在沿
轴=0
堆叠独立卡结果。因此,当移植到基于广播的解决方案时,我们可以在4D
阵列中创建这些标量1、2、3、4
的范围数组,除第一个轴外,所有轴都是单重维度(长度为1的DIM)。创建这样一个4D
数组可能有不同的方法。一种方法是:np.arange(1,5)[:,None,None,None]
,我们用np.arange
创建一个1D
数组,只需添加三个单件DIM,作为最后三个单件DIM
我们将该4D
数组与b
进行相等比较,这将允许b
元素沿最后三个DIM内部相等。然后,我们将其与原始代码中的a相乘,得到所需的输出
因此,执行工作将是非常重要的-
out = a*(b == np.arange(1,5)[:,None,None,None])
何时/如何使用。
(省略号):
在尝试将新轴添加到多维数组中时,我们使用…
(省略号),并且不希望指定每个dim的冒号。因此,要使a
a4D
数组的最后一个dim为单态,我们将执行:a[:,:,:,无]
。打字太多了!因此,我们使用那里的…
来帮助我们:a[…,None]
。请注意,此…
符号的使用与尺寸数量无关。因此,如果a
是一个5D
数组,并在其中添加一个新轴作为最后一个轴,我们将执行a[:,:,:,:,:,无]
或只需省略号:a[…,无]
。整洁啊 您正在沿轴=0
堆叠独立卡结果。因此,当移植到基于广播的解决方案时,我们可以在4D
阵列中创建这些标量1、2、3、4
的范围数组,除第一个轴外,所有轴都是单重维度(长度为1的DIM)。创建这样一个4D
数组可能有不同的方法。一种方法是:np.arange(1,5)[:,None,None,None]
,我们用np.arange
创建一个1D
数组,只需添加三个单件DIM,作为最后三个单件DIM
我们将该4D
数组与b
进行相等比较,这将允许b
元素沿最后三个DIM内部相等。然后,我们将其与原始代码中的a相乘,得到所需的输出
因此,执行工作将是非常重要的-
out = a*(b == np.arange(1,5)[:,None,None,None])
何时/如何使用。
(省略号):
在尝试将新轴添加到多维数组中时,我们使用…
(省略号),并且不希望指定每个dim的冒号。因此,要使a
a4D
数组的最后一个dim为单态,我们将执行:a[:,:,:,无]
。打字太多了!因此,我们使用那里的…
来帮助我们:a[…,None]
。请注意,此…
符号的使用与尺寸数量无关。因此,如果a
是一个5D
数组,并在其中添加一个新轴作为最后一个轴,我们将执行a[:,:,:,:,:,无]
或只需省略号:a[…,无]
。整洁啊 形状(4,3,7,2)
的输出不是吗?它是8,因为我为ace low Straight添加了一张虚拟卡(最高卡-12),形状(4,3,7,2)
的输出不是吗?它是8,因为我为ace low Straight添加了一张虚拟卡(最高卡-12),效果非常好。我只是想知道有没有什么解决方案。。。使用了符号,但我仍然不知道何时使用它。@nickpick看看这是否有帮助-。这里不需要它,因为我们没有在任何多维数组中添加新的轴。明白了:对于三维数组,a[…,0]与a[:,:,0]相同,对于4d,a[:,:,:,0],类似地,[0,…,0]是[0,:,:,,,:,0]。thanks@nickpick在上面添加了一个部分。@rayryeng是的,我想链接的帖子已经解释过了