如何使用Python使用动态数组执行Numpy广播?

如何使用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可以使您无需内存开销地无限循环遍历组件。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程