【python入门】multiply用法

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

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 函数调用入门教程 #### 什么是函数? 在 Python 中,函数是一段可以重复使用的代码块,用于完成特定的任务。通过定义和调用函数,可以使程序更加模块化、易于维护并提升可读性。 #### 如何定义一个函数? 可以通过 `def` 关键字来定义一个函数。以下是基本语法: ```python def function_name(parameters): """文档字符串""" # 函数体 return value # 可选 ``` - `function_name`: 函数的名字。 - `parameters`: 参数列表(可选)。 - `return`: 返回值(可选)。如果没有指定,则默认返回 `None`。 #### 基本的函数调用方式 下面介绍几种常见的函数调用方法及其应用场景。 --- ##### 1. 普通函数调用 这是最常见的一种函数调用形式,直接传入必要的参数即可[^1]。 ```python def greet(name): print(f"Hello, {name}") greet("Alice") # 输出: Hello, Alice ``` --- ##### 2. 使用位置参数 当调用带有多个参数的函数时,默认情况下会按照从左到右的顺序依次匹配参数[^5]。 ```python def add(a, b): return a + b result = add(3, 5) # 结果为8 print(result) ``` --- ##### 3. 使用关键字参数 除了按位置传递参数外,还可以通过参数名称显式赋值[^5]。 ```python def subtract(x, y): return x - y difference = subtract(y=7, x=10) # 显式指定了x和y的值 print(difference) # 输出: 3 ``` --- ##### 4. 默认参数 可以在定义函数时设置某些参数的默认值,这样即使调用时不提供这些参数也不会报错。 ```python def power(base, exponent=2): return base ** exponent print(power(3)) # 输出: 9 (默认指数为2) print(power(3, 3)) # 输出: 27 (手动设置了指数为3) ``` --- ##### 5. 可变长度参数 (*args 和 **kwargs) 如果不确定要向函数传递多少个参数,可以利用特殊符号让其接受任意数量的位置参数或关键字参数[^5]。 - `*args`: 接收不定量的位置参数作为元组处理。 - `**kwargs`: 接收不定量的关键字参数作为字典处理。 ```python def display_info(*args, **kwargs): print("Positional arguments:", args) print("Keyword arguments:", kwargs) display_info("Python", "Tutorial", version="3.9", level="Beginner") # 输出: # Positional arguments: ('Python', 'Tutorial') # Keyword arguments: {'version': '3.9', 'level': 'Beginner'} ``` --- ##### 6. 装饰器 装饰器本质上是一个高阶函数,它可以修改另一个函数的行为而无需改变原函数的内容[^3]。 ```python import time def timing_decorator(func): def wrapper(): start_time = time.time() func() end_time = time.time() print(f"Spend is {(end_time - start_time):.4f} seconds.") return wrapper @timing_decorator def example_function(): time.sleep(2) print("Function executed.") example_function() # 输出类似于: # Function executed. # Spend is 2.0000 seconds. ``` --- ##### 7. 部分应用函数 (`functools.partial`) 借助于标准库中的 `partial()` 方法,我们可以预先填充部分参数从而创建新的简化版函数实例[^4]。 ```python from functools import partial def multiply(x, y): return x * y double = partial(multiply, y=2) triple = partial(multiply, y=3) print(double(5)) # 输出: 10 print(triple(5)) # 输出: 15 ``` --- ##### 8. 动态求值 (`eval`) 尽管不推荐频繁使用此特性以免引入安全隐患,在必要场合下可通过 `eval()` 来解析字符串表达式的计算结果[^4]。 ```python expression = "2 + 3 * 4" result = eval(expression) print(result) # 输出: 14 ``` > 注意:由于存在潜在风险,请谨慎对待来自不可信源的数据输入! --- ##### 9. 自定义与内置/第三方函数的区别 根据需求不同,可以选择三种类型的现成工具解决实际问题[^2]: - 内置函数:由官方提供的核心功能集合,如 `len()`, `abs()`. - 第三方库函数:社区贡献扩展资源,需单独安装导入后方可访问。 - 用户自定义函数:针对具体场景开发专属逻辑实现方案。 --- #### 总结 以上列举了几类典型的 Python 函数调用模式供初学者参考学习。随着实践积累加深理解程度之后还能探索更多高级技巧进一步优化工作效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值