如何使用Python使用动态数组执行Numpy广播?
“广播”是指NumPy在算术操作期间处理不同维度的数组的方式。较小的数组被“广播”到较大的数组上,但受到某些限制,以确保它们的形状一致。广播允许您矢量化数组操作,使您可以在C中循环而不是Python。
这是在不需要不必要的数据拷贝的情况下实现的,从而实现高效的算法实现。在某些情况下,广播是一种负面的想法,因为它导致了浪费的内存利用,从而减慢了计算速度。
在本文中,我们将向您展示如何使用Python对NumPy数组执行广播。
执行给出数组的广播步骤-
-
步骤1. 创建两个具有兼容尺寸的数组
-
步骤2. 打印给定的数组
-
步骤3. 使用两个数组执行算术运算
-
步骤4. 打印结果数组
将两个不同尺寸的数组相加
使用arange()函数创建由0到n-1个数字组成的numpy数组(arange()函数返回在给定间隔内均匀间隔的值。在半开区间[start,stop]内,生成值),并加上一些常量数字。
示例
import numpy as np
#获取从0到7的数字列表
givenArray = np.arange(8)
#向numpy数组添加数字
result_array = givenArray + 9
print("输入数组",givenArray)
print("将9添加到输入数组后的结果数组",result_array)
输出
输入数组[0 1 2 3 4 5 6 7]
将9添加到输入数组后的结果数组[9 10 11 12 13 14 15 16]
给定的数组有一个长度为8的一维(轴),而9是一个简单的整数而没有维度。由于它们的维度不同,NumPy尝试广播(只是拉伸)较小数组沿某些轴,使其适用于数学运算。
将具有兼容尺寸的数组相加
使用arange()函数从0到n-1的数字列表创建两个NumPy数组,并使用reshape()函数将其重新整形(重新整形数组而不影响其数据)。两个数组的尺寸(3,4)和(3,1)兼容,并添加两个数组的相应元素。
示例
import numpy as np
#获取0到11的数字列表,并将其重新调整为3行4列
givenArray_1 = np.arange(12).reshape(3, 4)
#打印数组的形状(行大小、列大小)
print("数组1的形状=",givenArray_1.shape)
#获取0到2的数字列表并将其重新调整为3行1列
givenArray_2 = np.arange(3).reshape(3,1)
print("数组2的形状=",givenArray_2.shape)
#将两个数组相加
print("输入数组1:\n",givenArray_1)
print("输入数组2:\n",givenArray_2)
print("将两个数组相加:")
print(givenArray_1 + givenArray_2)
输出
数组1的形状= (3, 4)
数组2的形状= (3, 1)
输入数组1:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
输入数组2:
[[0]
[1]
[2]]
将两个数组相加:
[[ 0 1 2 3]
[ 5 6 7 8]
[10 11 12 13]]
givenArray_2沿第二个维度展开以匹配给定Array_1的维度。由于两个数组的维度兼容,这是可能的。
将不兼容维度的数组相加
创建两个NumPy数组,维度不兼容(6,4)和(6,1)。当我们尝试添加两个数组的相应元素时,会引发错误,如下所示。
示例
import numpy as np
# 从0到11得到一组数字,并将其重新排列为3行4列
givenArray_1 = np.arange(20).reshape(6, 4)
# 打印数组的形状(行数,列数)
print("The shape of Array_1 = ", givenArray_1.shape)
# 从0到5得到一组数字,并将其重新排列为3行1列
givenArray_2 = np.arange(6).reshape(6, 1)
print("The shape of Array_2 = ", givenArray_2.shape)
# 对两个数组进行求和
print("Summing both the arrays:")
print(givenArray_1 + givenArray_2)
输出
Traceback (most recent call last):
File "main.py", line 3, in
givenArray_1 = np.arange(20).reshape(6, 4)
ValueError: cannot reshape array of size 20 into shape (6,4)
该数组有6行和4列。它不能插入到尺寸为20的矩阵中(需要一个24的矩阵)。
求和Numpy多维数组和线性数组
使用arange()函数创建一个多维数组,并使用reshape()函数将其调整为随机行和列的数量。创建另一个线性数组并对这两个数组求和。
示例1
import numpy as np
# 从0到14得到一组数字,并将其重新排列为5行3列
givenArray_1 = np.arange(15).reshape(5, 3)
# 打印数组的形状(行数,列数)
print("The shape of Array_1 = ", givenArray_1.shape)
# 从0到2得到一组数字
givenArray_2 = np.arange(3)
print("The shape of Array_2 = ", givenArray_2.shape)
# 对两个数组进行求和,并打印它们的值
print("Array 1 \n",givenArray_1)
print("Array 2 \n",givenArray_2)
print("Summing both the arrays: \n",givenArray_1 + givenArray_2)
输出
The shape of Array_1 = (5, 3)
The shape of Array_2 = (3,)
Array 1
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]
[12 13 14]]
Array 2
[0 1 2]
Summing both the arrays:
[[ 0 2 4]
[ 3 5 7]
[ 6 8 10]
[ 9 11 13]
[12 14 16]]
```
给定的线性数组扩展到与给定数组1(多维数组)的维度匹配。由于两个数组的维度是兼容的,因此可以实现这一点。
### 示例2
```shell
import numpy as np
givenArray_1 = np.arange(240).reshape(6, 5, 4, 2)
print("The shape of Array_1: ", givenArray_1.shape)
givenArray_2 = np.arange(20).reshape(5, 4, 1)
print("The shape of Array_2: ", givenArray_2.shape)
# 对两个数组进行求和并打印它的形状。
```shell
Summing both the arrays and printing the shape of it:
print((givenArray_1 + givenArray_2).shape)
(6, 5, 4, 2)
必须理解,在多个维度上可以将多个数组进行传播。Array1的维度为(6, 5, 4, 2),而Array2的维度为(5, 4, 1)。在第三个维度上拉伸Array1,而在第一和第二个维度上拉伸Array2,形成一个维度为(6, 5, 4, 2)的数组。
结论
Numpy的广播比沿着一个数组循环更快。从第一个例子开始。用户可以循环遍历数组,向每个元素添加相同的数,而不是使用广播方法。这种方法很慢的原因有两个:循环需要与Python循环交互,这会减缓C语言实现的速度。其次,NumPy使用步骤(strides)而不是循环。将步骤(strides)设置为0可以使您无需内存开销地无限循环遍历组件。