广播功能中尺寸较大的Numpy ValueError

时间:2019-04-05 15:24:35

标签: python numpy

这可能是转发,但我不确定标题使用的措辞。

我正在尝试通过重塑形状以创建更大的数组来减去数组内部的数组值。

xn = np.array([[1,2,3],[4,5,6]])
yn = np.array(([1,2,3,4,5], [6,7,8,9,10]])

xn.shape
Out[42]: (2, 3)

yn.shape
Out[43]: (2, 5)

我想要的功能是:

yn.reshape(2,-1,1) - xn

这会引发值错误,但是当我删除第一个维度作为因数时,下面的方法就很好了:

yn.reshape(2,-1,1)[0] - xn[0]
Out[44]: 
array([[ 0, -1, -2],
       [ 1,  0, -1],
       [ 2,  1,  0],
       [ 3,  2,  1],
       [ 4,  3,  2]])

这是我期望的第一个输出,因为xnyn的第一维均为2。

是否有适当的方法可以实现所需的广播?

所需的输出:

array([[[ 0, -1, -2],
        [ 1,  0, -1],
        [ 2,  1,  0],
        [ 3,  2,  1],
        [ 4,  3,  2]],
       [[2, 1, 0],
        [3, 2, 1],
        [4, 3, 2],
        [5, 4, 3],
        [6, 5, 4]]])

2 个答案:

答案 0 :(得分:1)

>>> x
array([[1, 2, 3],
       [4, 5, 6]])
>>> y
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10]])
>>> z = y.reshape(2,-1,1)

x添加另一个轴:

>>> z-x[:,None,:]
array([[[ 0, -1, -2],
        [ 1,  0, -1],
        [ 2,  1,  0],
        [ 3,  2,  1],
        [ 4,  3,  2]],

       [[ 2,  1,  0],
        [ 3,  2,  1],
        [ 4,  3,  2],
        [ 5,  4,  3],
        [ 6,  5,  4]]])
>>>

或者只是:

>>> y[...,None] - x[:,None,:]
array([[[ 0, -1, -2],
        [ 1,  0, -1],
        [ 2,  1,  0],
        [ 3,  2,  1],
        [ 4,  3,  2]],
       [[ 2,  1,  0],
        [ 3,  2,  1],
        [ 4,  3,  2],
        [ 5,  4,  3],
        [ 6,  5,  4]]])

答案 1 :(得分:1)

要从broadcasting rules开始广播,形状必须相等或其中之一必须等于1(从尾随尺寸开始并向前移动)。因此,交换xn的最后两个维度将使您可以广播(向xn添加另一个维度之后):

yn.reshape(2, -1, 1) - xn.reshape(2, -1, 1).swapaxes(-1, -2)
array([[[ 0, -1, -2],
        [ 1,  0, -1],
        [ 2,  1,  0],
        [ 3,  2,  1],
        [ 4,  3,  2]],

       [[ 2,  1,  0],
        [ 3,  2,  1],
        [ 4,  3,  2],
        [ 5,  4,  3],
        [ 6,  5,  4]]])

yn.reshape(2, -1, 1)的形状为(2, 5, 1)xn.reshape(2, -1, 1).swapaxes(-1, -2)的形状为(2, 1, 3)。现在可以广播了,因为从尾随的尺寸开始,通过逐元素比较,尺寸相等或其中之一等于1。