numpy 广播

2024-01-07 17:17:10

现在有两个数组分别为:

arr1 = [0, 1, 2, 3, 4, 5, 6]
arr2 = [1]

这两个数组可以进行广播吗?

二维数组广播:

arr1 = np.arange(0,3).reshape(1,3)

array([[0, 1, 2]])

arr2 = np.arange(4,7).reshape(3,1)

array([[4],
       [5],
       [6]])

?这两个数组可以进行广播吗?

?这两个三维数组可以进行广播吗?

array4 = np.array(np.arange(4).reshape(2,2,1))

      [[[0],
        [1]],

       [[2],
        [3]]]

array5 = np.array(np.arange(12).reshape(2, 1, 6))

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

       [[ 6,  7,  8,  9, 10, 11]]]

?显然可以这是为什么?

我们再看两个数组,它们之间可以通过广播操作,进行计算吗?

?我们先看看这段话:

当两个或多个数组在某个维度上的长度不相等时,如果其中至少有一个数组在这个维度上的长度为1,则它们可以进行广播运算。

array5 = np.array(np.arange(24).reshape(2, 2, 6))

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

       [[12, 13, 14, 15, 16, 17],
        [18, 19, 20, 21, 22, 23]]]
array6 = np.array(np.arange(6,14).reshape(2, 1, 4))
[[[ 6,  7,  8,  9]],

       [[10, 11, 12, 13]]]

?

显然不行? 这是为什么?看看报错:

ValueError: operands could not be broadcast together with shapes (2,2,6) (2,1,4) 

?

我们来讲讲吧? 首先我给大家举例的都是? 维度相同相同的数组,两个进行相加的数组的维度都相同,维度不相通的数组我们在后面举例,以维度相同的数组先开始.

先看这两个数组, arr1 = [0, 1, 2, 3, 4, 5, 6] 和 arr2 = [1] arr1 和 arr2 都是一位数组,而且  arr2 一维的长度只有 1 ,所以在它们之间进行操作时,arr2 可以进行扩展延伸至另一方在该维度上相同的长度。

arr2 = [1]? ?进行广播后? ? ?arr2 =?[1, 1, 1, 1, 1, 1, 1?],然后利用??[1, 1, 1, 1, 1, 1, 1?]? 和[0, 1, 2, 3, 4, 5, 6]? 进行求和操作。

我们看看结果是不是我们想的那样?

?这两个二维数组是怎样完成的呢?

?

arr1 = np.arange(0,3).reshape(1,3)

arr2 = np.arange(4,7).reshape(3,1)

arr1 和? arr2 都是2维数组,??arr1 数组形状是|(1,3) arr2 的数组形状是?(3,1)请看这段话:

两个数组在所有维度上的长度要么相等,要么其中一个数组在对应维度的长度为1

当两个相同维度的数组上, 出现一个维度的长度不相等时,若其中任一数组在该维度上的长度为1,则可以进行广播。

arr1 怎么扩展延伸: arr1 数组在第一个维度上与arr2 不相同,但因长度为1 所以可以进行扩展,扩展到什么程度呢??长度为1的维度就可以被“延伸到”以匹配另一个数组在该维度上的长度,从而实现广播。

arr1 原数组:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? arr2 原数组

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

arr1 广播后的数组? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?arr2 广播后的数组

[[0, 1, 2],? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[[4,4,4],

[0, 1, 2] ,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[5,5,5],

[0, 1, 2]]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [6,6,6] ]? ? ? ?

然后对扩展后的数组做操作(对应位置的元素进行求和):

?大家计算一下是不是没有问题。

三维数组也是这样玩的,但是需要大家自己主动思考我把运行数组打印给大家,大家思考如何扩展,如何求和?

array5 = np.array(np.arange(8,12).reshape(2, 2, 1))
array6 = np.array(np.arange(6,18).reshape(2, 1, 6 ))

?也很简单: 大家看相同维度的数组元素个数与排布,三维数组肯定只有三维以下数组,也即是两维和一维存在元素,四维肯定是四维以下,三维 、二维、一维数组存在元素,更高维, 同理。

现在这是三维,我们去看两个二维数组的元素个数和排布:

?行和列分别指的是第二个维度和第三个维度,这是正确的示意,我为了大家和我理解将其解释为了 红色子标注。

?前提是数组维度相同, 在相同维度的地方,有一个数组的维度长度为1,这一个维度长度为1 的维度长度,会扩展到与另一个数组维度长度相同的长度。

什么意思? arr5 二维数组的地方,是两行一列,它就会通过广播,将列扩展到和arr6列的长度 七一样大小的长度,也是七列

arr6二维数组的地方的长度?,一行七列,它会通过广播,将行扩展到与arr5 行一样大小 2 的长度,也是 2行。

到时候 ,arr5 和 arr6 都是 两行七列,这就回到了,相同数组进行求和操作。 它们分别通过广播完成。

那维度不相同的两个数组怎么通过广播进行加法操作

前提是它们满足以下条件:

  1. 所有参与运算的数组在每个对应的维度上的长度要么相同,要么其中至少有一个数组在该维度上的长度为1。
  2. 在长度为1的维度上,这个维度将被“拉伸”以匹配其他数组的相应维度。

?# 三维数组

arr1 = np.arange(0,9).reshape(3,1,3)

      [[[0, 1, 2]],

       [[3, 4, 5]],

       [[6, 7, 8]]]   

# 二维数组

arr2 = np.arange(6,9).reshape(1,3)

[[6, 7, 8]]

?

?注意: 这句话? ? ? 所有参与运算的数组在每个对应的维度上的长度要么相同

?arr1? 的形状是? ?(3,1,3)? ? ? ?第一个维度长度是 : 3 ,第二个维度长度是: 1, 第三个维度长度是: 3

arr2? 的形状是(1,3) 第一个维度长度是: 1, 第二个维度长度: 3,?

啊? 它们对应的维度的长度不相同啊? 不要忘了?arr1? ?是三维数组,它里面的二维的第一个维度的长度是 :1, 第二个维度长度是: 3, 这样不就对应了? 。

因为arr2 的是二维,它如何变成三维,给他再加上一个方向,他就变成了三维,二维数组是一张表格,在深度上加一个方向,也就是再给一些表格让其垒起来。那我们再去看ndarray 数组结构是怎样表示

arr2 :

? ?[[6, 7, 8]]

arr2变三维:

[

? ?[[6, 7, 8]]

? ? ? ? ? ? ? ? ? ]

给它外层加了一个括号。

我们对比一下arr 变成三维后和三维数组arr1的区别:

arr1:

[[[0, 1, 2]],

  [[3, 4, 5]],

  [[6, 7, 8]]]

是不是将arr2 多给两个,它们的维度、维度长度都相同了。

[

? ?[[6, 7, 8]],

? ?[[6, 7, 8]],

? ?[[6, 7, 8]]

? ? ? ? ? ? ? ? ? ]

?这个向外延伸,直到和另一个数组相同大小的维度、维度长度就算完成了。

arr2 本来形状是: (1,3)给它前面加一个维度,维度长度是1 , 变为 (1,1,3)

这样就有回到了 相同维度,不相同维度长度的数据广播内容中了。

好了我发现越解释越繁琐,我心里明白了但是没办法给大家,再解释更详细点,大家有啥不同大家可以评论或者私信,我看到后会给大家解释。


?总结:?

两个数组相同维度,各其对应维度的维度长度相同或不相同:

维度长度相同: 可以直接进行操作(加减乘除)

维度长度不相同: 两个数组的对应维度必须要有一个为 1, 多个维度,只要有一个维度长度不相同,这个维度必须为1 才可以通过广播进行延伸扩展,进行两数组操作。

两个数组维度不相同,长度相同或者不相同。

长度相同: 所有参与运算的两个数组在每个对应的维度上的长度相同

长度不同:两个数组对应的维度,必须有一个为1 。?

? ?a = (2,3,1)? ?b = (1,3)? ? a = (2,2,2)? b = (2,2)

?


这是我今年的最后一篇文章了,祝愿国泰民安,每一个csdn 用户,安康如意

又送大家几句古语:

?修数百年崎岖之路,造千万人来往之桥

?家富提携亲戚,岁饥赈济邻朋? -? 文昌帝君阴骘文

希望大家常怀悯人之心,多做好事!

文章来源:https://blog.csdn.net/weixin_59131972/article/details/135431467
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。