有一个简单的函数,它打算接受标量参数,但也适用于numpy矩阵。为什么函数fun
适用于矩阵?
>>> import numpy as np
>>> def fun(a):
return 1.0 / a
>>> b = 2
>>> c = np.mat([1,2,3])
>>> c
matrix([[1, 2, 3]])
>>> fun(b)
0.5
>>> fun(c)
matrix([[ 1. , 0.5 , 0.33333333]])
>>> v_fun = np.vectorize(fun)
>>> v_fun(b)
array(0.5)
>>> v_fun(c)
matrix([[ 1. , 0.5 , 0.33333333]])
似乎fun
以某种方式被矢量化,因为明确的矢量化函数v_fun
在矩阵c
上的行为相同。但是他们在标量b
上获得了不同的输出。有人可以解释一下吗?感谢。
答案 0 :(得分:0)
fun
的情况称为broadcasting。
一般广播规则
在两个数组上运行时,NumPy会逐元素地比较它们的形状。它从尾随尺寸开始,并向前发展。
时兼容两个维度
- 他们是平等的,或
- 其中一个是1
醇>如果不满足这些条件,则会抛出ValueError:frames未对齐的异常,表示阵列具有不兼容的形状。结果数组的大小是输入数组每个维度的最大大小。
答案 1 :(得分:0)
{{total_pages}}
已经适用于标量和数组 - 因为元素分割是为两者(他们自己的方法)定义的。 fun
根本不涉及fun(b)
,只是Python操作。
numpy
旨在采用仅适用于标量的函数,并从数组中提取元素。在您的示例中,它首先将np.vectorize
转换为数组b
。对于np.array(b)
和此修改后的c
,结果是匹配大小的数组。 b
是一个2d np.matrix,结果是一样的。请注意,c
的类型为fun(b)
,而不是array
。
这不是使用matrix
的好例子,也不是广播的例子。 np.vectorize
是一个相当“简单”的功能,不会以特殊的方式处理标量。
np.vectorize
甚至1/c
的工作原因是b/c
,数组“知道”分裂。类似地,定义了数组乘法和加法:c
或1+c
。
我很想将此标记为
的副本