【问题标题】:numpy broadcasting with 3d arrays使用 3d 数组进行 numpy 广播
【发布时间】:2017-09-08 18:40:33
【问题描述】:

是否可以应用 numpy 广播(使用一维数组),

x=np.arange(3)[:,np.newaxis]
y=np.arange(3)
x+y=
array([[0, 1, 2],
       [1, 2, 3],
       [2, 3, 4]])

到类似于下面的 3d 矩阵,这样 a[i] 中的每个元素都被视为像上面示例中的 1D 向量?

a=np.zeros((2,2,2))
a[0]=1
b=a
result=a+b

导致

result[0,0]=array([[2, 2],
                   [2, 2]])

result[0,1]=array([[1, 1],
                   [1, 1]])

result[1,0]=array([[1, 1],
                   [1, 1]])

result[1,1]=array([[0, 0],
                   [0, 0]])

【问题讨论】:

  • 你能用一个随机数组而不是那个 zeros 数组来演示预期的输出吗?
  • 我使用 zeros 数组以便于手动求解,我希望上面的一维数组示例能够阐明我的意图。但希望该解决方案能够向其他观众阐明我想要什么。

标签: python arrays numpy array-broadcasting


【解决方案1】:

您可以像一维数组一样执行此操作,即在 ab 的轴 0 和轴 1 之间插入一个新轴:

a + b[:,None]    # or a[:,None] + b

(a + b[:,None])[0,0]
#array([[ 2.,  2.],
#       [ 2.,  2.]])

(a + b[:,None])[0,1]
#array([[ 1.,  1.],
#       [ 1.,  1.]])

(a + b[:,None])[1,0]
#array([[ 1.,  1.],
#       [ 1.,  1.]])

(a + b[:,None])[1,1]
#array([[ 0.,  0.],
#       [ 0.,  0.]])

【讨论】:

  • 就这么简单,我想在尝试这种方法时,我没有使用索引来指定应该出现哪个数组,而是让所有数组都出现,即a+b[:,none],然后让我感到困惑,因为它看起来不像正确的输出。
  • 我不怀疑。直观地识别一个 4 维数组并不容易。
  • 当然可以,但不应使用None,而应使用np.newaxis
【解决方案2】:

由于ab 的形状相同,所以说(2,2,2)a+b 确实可以工作。 广播的工作方式是它以相反的顺序匹配操作数的维度,从最后一个维度向上开始(例如,在二维情况下考虑行之前的列)。如果维度匹配,则考虑下一个维度。

如果维度不匹配,并且如果其中一个维度是 1,则重复该操作数的维度以匹配另一个操作数(例如,如果 a.shape = (2,1,2)b.shape = (2,2,2) 则第一个维度的值重复a 以制作形状(2,2,2))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    相关资源
    最近更新 更多