numpy:一个做数值运算的库;
为什么引用numpy:
标准python中引用列表保存一组值,可当做数组使用;但由于列表的元素可是任何对象,因此列表中保存的是对象的指针(地址);对于数值运算来说,这种结构浪费内存和cpu计算;python提供了array模块,它和列表不同,能直接保存数值,但由于它不支持多维数组,也没有运算函数,所以也不适合做数值运算
numpy中定义的最重要对象时ndarray的N维数组类型,它描述了相同类型的元素集合。可以使用基于0的索引访问集合中的项目
ndarray中每个元素在内存中使用相同大小的块
数组属性:
ndim:返回int, 表示维数
shape:返回tuple, 表示数组尺寸
itemsize:返回int,表示数组每个元素的大小
np.ones_like(a) #和a的shape一样的全1数组
np.full((3,2),1) #3*2的里面值全为1的数组
查看np函数使用方法:
help(np.full)
np.info(np.full)
np.full?
np.identity(3) #单位数组
np.diag([1,2,3]) #对角数组
np.empty((4,4)) #空数组,它会占据内存空间,但是对于元素值是随机产生的
数组的运算
单个数值的numpy.sin的计算速度只有math.sin的1/3,这是因为numpy.sin为了同时支持数组和单个值的计算,其c语言内部实现要比math.sin复杂很多
矩阵操作的numpy.sin比math.sin快20倍多,这得利于numpy.sin在c语言级别的循环计算
#将计算单个值的函数转换为一个能对数组的每个元素进行计算的函数
triangle_ufunc1=np.frompyfunc(triangle_wave, 4, 1)
#frompyfunc(func,nin,nout),func是计算单个元素的函数,nin是func输入参数的个数,nout是func输出的参数个数
y2=triangle_ufunc1(x,0.6,0.4, 3) #可以说输入数组形式了
注意:def函数输入的参数都是单个单个的数值,而不能是数组,而通过frompyfunc进行转换后新生成的triangle_ufunc1就能将参数作为数组的形式输入
通用函数的广播机制:当我们用ufunc对两个数组进行计算时,ufunc会对这两个数组的对应元素进行计算,因此要求这两个数组shape相同;如果shape不同的话,会进行如下的广播处理(broadcasting)
让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分通过在前面加1补齐
输出数组的shape是输入数组shape的各个轴的最大值
如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错
当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值