Numpy广播到第四维度:。。。对:对无

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.,

在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.,   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个案例需要堆叠在一起,这就引出了我的问题:

我怎样才能通过广播做到这一点?以下是我的具体问题:

我试过一些东西

  • 让我们重点关注第一步,以获得doing suits==np.arange(4)中的布尔值(第二步只是与需要以与suits相同的方式广播的卡片相乘)。我的理解是,我们想为suites数组添加一个维度,所以我们不应该用3点符号来表示:
    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
    a
    4D
    数组的最后一个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
    a
    4D
    数组的最后一个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是的,我想链接的帖子已经解释过了