来源:千锋IT工程师
首先看一下python数据分析下的numpy模块
python大量的库为数据分析和处理提供了完整的工具集,比起R和Matlab等其他主要用于数据分析的编程语言,Python更全能,Python不仅提供数据处理平台,而且还有其他语言和专业应用所没有的应用。
可以用作脚本,可以操作数据库,可以开发web应用,Python库一直在增加,算法的实现采用更具创新性的方法,Python能和很多语言对接,例如高效的C语言
下面我们就开始简单的介绍一下numpy模块针对大量数据如何进行运算的:
Numerical Python
数组的定义
NumPy系统是Python的一种开源的数值计算扩展,数组是Numpy中最基本的数据对象,也是一种大容量数据容器。他的强大之处在于人们能够像操作标量那样操作数组。这样编出的代码不仅简单易于理解,而且基本告别了for语句,大大提高了运算速度。数组(Ndarray)可以是一维的,也可以是多维的,我们平常遇到的都是一维和二维数组。
例:
In [1]: import numpy as np
In [2]: data_array=np.array([0.243,0.246,0.32,0.345,0.231])
In [3]: data_array
Out[3]: array([ 0.243, 0.246, 0.32 , 0.345, 0.231])
In [4]: #array可以由列表直接产生
In [5]: data_array*3
Out[5]: array([ 0.729, 0.738, 0.96 , 1.035, 0.693])
In [7]: #可以与标量直接相乘,其计算方法与线性代数中矢量和标量相乘没有任何区别、
Ndarray必须是同构架的,也就是说,其中元素必须有相同结构。例如数值性数组每个元素都必须是数值。每个数组都有一个shape(表示各维度大小的元组)属性和一个dtype属性(一个说明数组数据类型的对象).假如你的数值型数组出现其他数据类型,系统不会报错,但数组的数据类型不在是数值,因此不再能进行数组的数学运算。
例:(数组中突然有字符串会出现什么结果?能运算吗?)
In [8]: dara_str=np.array([0.2,0.34,’am’])
In [9]: dara_str.dtype
Out[9]: dtype(‘
In [10]: dara_str*2
—————————————————————————
TypeError Traceback (most recent call last)
in ()
—-> 1 dara_str*2
TypeError: ufunc ‘multiply’ did not contain a loop with signature matching types dtype(‘
数组的创建
除了上节讲到的用简单列表创建一维数组外,还可以嵌套列表创造多维列表:
In [1]: building_array=[[1,2,3],[4,2,1.2],[2.3,3.2,1.6]]
In [3]: array_build=np.array(building_array)
In [4]: array_build
Out[4]:
array([[ 1. , 2. , 3. ],
[ 4. , 2. , 1.2],
[ 2.3, 3.2, 1.6]])
In [5]: #上面创建的是二维数组
In [6]: #下面我们创建一个3维数组
In [9]: buildarray_1=[[[2.4,1.2,9],[5.6,32,7],[2,1,2]],[[7.6,3.2,6.7],[1,0,0],[1,1,2]],[[3,3,3],[2,1,2],[4,7,65]]]
In [12]: arrat_out=np.array(buildarray_1)
In [13]: arrat_out
Out[13]:
array([[[ 2.4, 1.2, 9. ],
[ 5.6, 32. , 7. ],
[ 2. , 1. , 2. ]],
[[ 7.6, 3.2, 6.7],
[ 1. , 0. , 0. ],
[ 1. , 1. , 2. ]],
[[ 3. , 3. , 3. ],
[ 2. , 1. , 2. ],
[ 4. , 7. , 65. ]]])
In [14]: arrat_out.dtype
Out[14]: dtype(‘float64’)
In [16]: arrat_out.shape
Out[16]: (3, 3, 3)
特殊二维数组
0矩阵(二维数组)
In [17]: np.zeros(5)
Out[17]: array([ 0., 0., 0., 0., 0.])
In [19]: np.zeros((3,3))
Out[19]:
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
空矩阵(二维数组)
In [21]: np.empty((2,3,2))
Out[21]:
array([[[ 4.02472974e-312, 3.16202013e-322],
[ 0.00000000e+000, 0.00000000e+000],
[ 0.00000000e+000, 2.87822582e+180]],
[[ 1.11667979e+165, 2.00668786e-052],
[ 4.46803262e-062, 2.95834365e-032],
[ 7.69120705e+169, 4.35610475e-061]]])
空矩阵并不为空,认为空矩阵全为空值或者零值是不对的,空矩阵里面的元素都是返回的垃圾值。
Arange asarray ones one_like identity函数:
In [22]: np.arange(15)
Out[22]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
In [23]: #arange函数产生一维矩阵
In [24]: np.arange(16).reshape(2,2,2,2)
Out[24]:
array([[[[ 0, 1],
[ 2, 3]],
[[ 4, 5],
[ 6, 7]]],
[[[ 8, 9],
[10, 11]],
[[12, 13],
[14, 15]]]])
In [25]: #arange函数产生四维数组
#借助asarray把列表转化为数组
In [26]: list1=[3,21,2,1]
In [27]: build_1=np.asarray(list1)
In [28]: build_1
Out[28]: array([ 3, 21, 2, 1])In [32]: build_2=np.asarray(tuple_1)
In [33]: build_2
Out[33]: array([1, 2, 3])
In [34]: build3=np.array(tuple_1)
In [35]: build3
Out[35]: array([1, 2, 3])
#借助于asarray把元组转化为数组
In [29]: tuple_1=1,2,3
In [32]: build_2=np.asarray(tuple_1)
In [33]: build_2
Out[33]: array([1, 2, 3])
#借助于array把元组转化为数组
In [34]: build3=np.array(tuple_1)
In [35]: build3
Out[35]: array([1, 2, 3])
In [36]: np.ones((3,4))
Out[36]:
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
In [37]: np.ones_like(build3)
Out[37]: array([1, 1, 1])
In [41]: np.zeros_like(build_2)
Out[41]: array([0, 0, 0])
In [44]: np.identity(4)
Out[44]:
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])
Empty_like函数
In [3]: import numpy as np
In [4]: arrayrr=np.array([1,3,2])
In [5]: test_array1=np.empty_like(arrayrr)
In [6]: test_array1
Out[6]: array([6488174, 7077985, 7340146])
多维数组的数据类型
Dtype是一种特殊的对象,通过它的帮助ndarray能把一块内存解释为自己所需的数据类型来存放自己承载的数据,这个数据的类型就是数组解释的类型
In [8]: array123=np.array([1.4,6.7,6.6],dtype=np.float64)#指定数据类型的数组
In [10]: array123
Out[10]: array([ 1.4, 6.7, 6.6])
In [11]: array_321=np.array([1,6,6.7],dtype=np.int32)#如果这里设定数据类型为整形,那么,结果只能是整数数组,注意绿色标注的数组数据变化
In [12]: array_321
Out[12]: array([1, 6, 6])
数据类型表
Int8和uint8(有符号和无符号的8位整形,i1 和 u1);
Int16和uint16(同上,i2 和 u2)
Int32和uint32(同上,i4 和 u4)
Int64和uint64(同上,i8 和 u8)
Float16(半精度浮点数,f2)
Float32(单精度浮点数,f4)
Float64(双精度浮点数,f8)
Float128(扩展精度浮点数,f16)
Complex64(c8),Complex128(c16),
Complex256(c32)
Bool(?),object(O),string_(S),Unicode(U)
数组数据类型转换
Astype
In [13]: test_array=np.array([1,2,3,6,1])
In [14]: test_array
Out[14]: array([1, 2, 3, 6, 1])
In [15]: test_array.dtype
Out[15]: dtype(‘int32’)
In [16]: test_array_1=test_array.astype(np.float64)
In [18]: test_array_1.dtype
Out[18]: dtype(‘float64’)
Astype方法可以将数值型字符串数组直接转化数值型数组。
In [19]: numeric_strings=np.array([’12’,’21’,’33’],dtype=np.string_)
In [21]: numeric_strings.astype(np.float32)
Out[21]: array([ 12., 21., 33.], dtype=float32)