【python入门】multiply用法

本文详细解释了NumPy中的广播机制如何运作,特别是在不同形状数组间的数学运算中。通过实例展示了如何利用广播机制来实现高效的数组操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

multiply(a,b)就是个乘法,如果a,b是两个数组,那么对应元素相乘

先来看个例子:

为什么上面的multiply(a, b)是这种结果,原因是multiply是ufunc函数

当我们使用ufunc函数对两个数组进行计算时,ufunc函数会对这两个数组的对应元素进行计算,因此它要求这两个数组有相同的大小(shape相同)。如果两个数组的shape不同的话,会进行如下的广播(broadcasting)处理:

  1. 让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐
  2. 输出数组的shape是输入数组shape的各个轴上的最大值
  3. 如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错
  4. 当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值

上述4条规则理解起来可能比较费劲,让我们来看一个实际的例子。

先创建一个二维数组a,其shape为(6,1):
>>> a = np.arange(0, 60, 10).reshape(-1, 1)
>>> a
array([[ 0], [10], [20], [30], [40], [50]])
>>> a.shape
(6, 1)

再创建一维数组b,其shape为(5,):

>>> b = np.arange(0, 5)
>>> b
array([0, 1, 2, 3, 4])
>>> b.shape
(5,)


计算a和b的和,得到一个加法表,它相当于计算a,b中所有元素组的和,得到一个shape为(6,5)的数组:

>>> c = a + b
>>> c
array([[ 0,  1,  2,  3,  4],
       [10, 11, 12, 13, 14],
       [20, 21, 22, 23, 24],
       [30, 31, 32, 33, 34],
       [40, 41, 42, 43, 44],
       [50, 51, 52, 53, 54]])
>>> c.shape
(6, 5)

由于a和b的shape长度(也就是ndim属性)不同,根据规则1,需要让b的shape向a对齐,于是将b的shape前面加1,补齐为(1,5)。相当于做了如下计算:

>>> b.shape=1,5
>>> b
array([[0, 1, 2, 3, 4]])

这样加法运算的两个输入数组的shape分别为(6,1)和(1,5),根据规则2,输出数组的各个轴的长度为输入数组各个轴上的长度的最大值,可知输出数组的shape为(6,5)。

由于b的第0轴上的长度为1,而a的第0轴上的长度为6,因此为了让它们在第0轴上能够相加,需要将b在第0轴上的长度扩展为6,这相当于:

>>> b = b.repeat(6,axis=0)
>>> b
array([[0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4]])

由于a的第1轴的长度为1,而b的第一轴长度为5,因此为了让它们在第1轴上能够相加,需要将a在第1轴上的长度扩展为5,这相当于:

>>> a = a.repeat(5, axis=1)
>>> a
array([[ 0,  0,  0,  0,  0],
       [10, 10, 10, 10, 10],
       [20, 20, 20, 20, 20],
       [30, 30, 30, 30, 30],
       [40, 40, 40, 40, 40],
       [50, 50, 50, 50, 50]])

经过上述处理之后,a和b就可以按对应元素进行相加运算了。

当然,numpy在执行a+b运算时,其内部并不会真正将长度为1的轴用repeat函数进行扩展,如果这样做的话就太浪费空间了


这样,就能知道为什么multiply(a, b)是这种结果了

from:http://blog.csdn.net/qq_18433441/article/details/54868889

使用Python编写乘法函数有多种方法,下面是三种不同的示例: 1. 使用def语句定义一个函数,接收一个参数n,并使用for循环打印1到n乘以n的结果: ```python def multiplication(n): for m in range(1, n + 1): print(f"{m}*{n}={m*n}", end="\t") print() multiplication(10) ``` 这段代码定义了一个名为multiplication的函数,它接收一个参数n。在函数体内,使用for循环遍历从1到n的范围,将每个数字m与n相乘,并打印结果。最后,使用print()语句打印一个空行。通过调用multiplication函数,你可以传递一个整数作为参数来执行乘法运算。 2. 使用NumPy库的dot函数进行矩阵乘法: ```python import numpy as np X = np.array([[1, 2], [3, 4]]) Y = np.array([[5, 6], [7, 8]]) result = np.dot(X, Y) print(result) ``` 这段代码使用NumPy库导入了一个名为np的模块。然后,创建了两个二维数组X和Y,分别表示两个矩阵。通过调用np.dot函数,并传递X和Y作为参数,计算这两个矩阵的乘法结果,并将结果存储在result变量中。最后,使用print语句打印结果。 3. 使用嵌套的循环进行乘法运算: ```python i = 1 while i <= 9: for j in range(1, i + 1): print(f'{i}*{j}={i*j}', end=' ') i += 1 print() ``` 这段代码使用了一个while循环和一个嵌套的for循环来实现乘法运算。while循环控制从1到9的数字i,并在每次迭代中执行内部的for循环。for循环遍历从1到i的范围,将每个数字j与i相乘,并使用print语句打印结果。在内部的for循环结束后,使用i += 1递增i的值,并使用print()语句打印一个空行。这段代码将打印出1到9的乘法表。 这些是使用Python编写乘法函数的三个示例,可以根据需要选择适合的方法。希望对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [用Python实现九九乘法表的几种方式,入门必备案例!超级简单!](https://blog.csdn.net/fei347795790/article/details/120287309)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Python中的几种乘法np.dot,np.multiply,*](https://blog.csdn.net/weixin_44440282/article/details/89378672)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值