【问题标题】:Numpy - is there a way to specify broadcasting dimension?Numpy - 有没有办法指定广播维度?
【发布时间】:2020-11-14 18:43:20
【问题描述】:

广播只能(据我所知)从最后匹配形状的矩阵(形状[4,3,2] 可以广播形状[2][3,2][4,3,2])。但为什么呢?

考虑以下示例:

np.zeros([4,3,2])


[[[0 0]
  [0 0]
  [0 0]]

 [[0 0]
  [0 0]
  [0 0]]

 [[0 0]
  [0 0]
  [0 0]]

 [[0 0]
  [0 0]
  [0 0]]]

为什么无法使用[1,2,3][1,2,3,4] 进行广播?

添加[1,2,3](形状:[3],目标形状:[4,3,2])预期结果:

[[[1 1]
  [2 2]
  [3 3]]

 [[1 1]
  [2 2]
  [3 3]]

 [[1 1]
  [2 2]
  [3 3]]

 [[1 1]
  [2 2]
  [3 3]]]

添加[1,2,3,4](形状:[4],目标形状:[4,3,2])预期结果:

[[[1 1]
  [1 1]
  [1 1]]

 [[2 2]
  [2 2]
  [2 2]]

 [[3 3]
  [3 3]
  [3 3]]

 [[4 4]
  [4 4]
  [4 4]]]

或者,如果担心这种方式的多维广播,添加:

[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]

(形状:[4,3],目标形状:[4,3,2])预期结果:

[[[ 1  1]
  [ 2  2]
  [ 3  3]]

 [[ 4  4]
  [ 5  5]
  [ 6  6]]

 [[ 7  7]
  [ 8  8]
  [ 9  9]]

 [[10 10]
  [11 11]
  [12 12]]]

所以基本上我说的是我看不出它找不到匹配形状的原因,并分别进行操作。如果目标矩阵中有多个维度匹配,只需自动选择最后一个,或者可以选择指定我们要执行操作的维度。

有什么想法/建议吗?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    广播规则简单明了。

    • 根据需要添加前导大小 1 维度以匹配维度总数
    • 根据需要调整所有尺寸 1 的尺寸以匹配

    (4,3,2)

    (2,) => (1,1,2) => (4,3,2)
    (3,2) => (1,3,2) => (4,3,2)
    
    (3,) => (1,1,3) => (4,3,3) ERROR
    (4,) => (1,1,4)
    (4,3) => (1,4,3)
    

    使用reshapenp.newaxis,我们可以在正确的位置添加明确的新维度:

    (3,1) => (1,3,1) => (4,3,2)
    (4,1,1) => (4,3,2)
    (4,3,1) => (4,3,2)
    

    为什么它不自动做最后的事情?潜在的歧义。如果没有这些规则,尤其是“仅添加前导”,则可以在几个不同的位置添加额外的维度。

    例如

    (2,3,3) + (3,) => is that (1,1,3) or (1,3,1)?
    (2,3,3,3) + (3,3)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      • 2020-01-25
      • 2013-09-04
      相关资源
      最近更新 更多