numpy的优势在于科学的计算和数值处理。
例如,我们有一个列表[1,20,28,37,18,56],要求我们将每个元素乘以3,我们该怎么操作?
在python中,我们可以这样解决:
在这里,我们就可以直接整个数组乘3.
这里体现了numpy的优势所在。
在a*3中,我们称3为标量,称数组a为矢量或者向量。
我们这里对数组进行加减乘除的时候,都是对整个数组的元素进行操作。
当然两个数组也是能相操作,但是通常要求形状相同。
但是,也存在不要求一样的情况。
很明了,是a上的0轴与m相加。
这个例子很明了,是1轴相加。
比较运算和逻辑运算
python中的逻辑与比较运算在numpy这里仍然适用。
我们看到,不仅是相同位置的元素进行比较,而且返回的是一个数组。
但是当两个比较得数组形状不一样的时候,就无法进行。
在python中有and,or,not三个逻辑运算符,为了避免关键字,在numpy中,适用logiccal_and,lodical_or,lodical_not,logical_xor,等来表示相关逻辑运算符。
我们在python中可以这样的运算:
我们尝试在numpy中进行相同的操作。
我们得到了报错,提示我们适用a.any()或者a.all(),查看文档,知道这两个函数的意义。
np.any(a,axis=None,out=None),a是类数组对象,只要a中(或者某个指定的轴中)有一个元素是True,则返回True,否则返回False。
np.all(a,axis=None,out=None),如果数组对象a中全为True,则返回True,否则返回False。
通用函数
在numpy中有一类函数称为通用函数,能对数组中每个元素进行操作,速度非常快。
numpy中有一些默认函数,根据默认参数进行划分,一个为一元函数,两个为二元函数。
常用的一元函数举例:
np.sin,np.cos,np.tan 三角函数
np.arcsin,np.arccos,np.arctan 反三角函数
np.sinh,np.cosh,np.tanh 双曲三角函数
np.aqrt 求平方根
np.exp 计算自然指数
np.log,np.log2,np.log10 分别以e,2,10为底的对数。
常用的二元函数:
np.add,np.subtract,np.multiply,np.divide 算数运算函数
np.equal,np.not_equal,np.less,np.less_equal,np.greater,np.greater_equal
比较运算函数
np.power指数运算
np.remainder得到余数
np.reciprocal返回倒数
np.real,np.imag,np.conj返回复数的实部,虚部和完整的复数
np.sign,np.abs得到对象符号和绝对值
np.floor,np.ceil,np.rint结果都是取整
np.round四舍五入。
对于数学中的三角函数平方和为1,那么我们怎么在numpy中实现呢?
我们不仅仅可以使用内置的函数,我们还能进行自定义。
自定义通用函数
我们写一个关于bmi(身体质量指数)的函数,通过这个函数判断一个人的胖瘦。
def bmi(height,weight):
bmi_index=weight/height**2
if bmi_index>18and bmi_index<25:
return 0
elif bmi_index<=18:
return -1
else :return 1
bmi(1.55,45)
在这个函数中,我们粗略的对胖瘦进行了三档划分,即正常为0,偏瘦为-1,偏胖为1。
我们判断一次就需要输入一次,,如果我们需要一次判断多人,我们可以考虑循环,也可以考虑用数组的方法。
我们先模拟出来一组信息:
h = (2.2-1.4)*np.random.random_sample((10,))+1.4
h = np.round(h,2)
w = (96-30)*np.random.random_sample((10,))+30
w = np.round(w,2)
可以看见,我们模拟完毕。
接下来就是进行测试,但是出了问题。
出错了,我们发现出错了,并不是我们所想的那样。
查看提示的错误信息,得知,程序建议我们使用any或all,但是这样就不是我们所想要的情况了。
这样才能实现我们的预期。
为什么函数在经过处理过后就能成为对数组进行操作的函数了呢?
根源于np.frompyfunc(),它能让函数成为能够针对数组进行元素级操作的通用函数。
函数的完整结构是frompyfunc(func,nin,nout),其意义参考如下:
func:python中定义的函数对象
nin:一个整数,表示func函数所能接收的参数个数
nout:一个整数,表示func函数返回的对象个数