本文是学习《利用python进行数据分析》的部分笔记,在这里感谢作者。
Numpy是高性能科学计算和数据分析的基础包,在这里只罗列一些numpy的常用功能。
一:导入Numpy:
import numpy as np
它是一个N维的数组对象,也就是说,其中的元素必须是同类型的。
二:创建ndarray
使用array函数,参数是一切序列化的对象,比如:
data1=[6,7.5,8,0,1] >>> arr1=np.array(data1) >>> arr1 array([ 6. , 7.5, 8. , 0. , 1. ])
嵌套序列会被转换成为一个多维数组:
>>> data2=[[1,2,3,4],[5,6,7,8]] >>> arr2=np.array(data2) >>> arr2 array([[1, 2, 3, 4], [5, 6, 7, 8]])
shape函数可以返回各维度大小
>>> arr2.shape (2, 4)
dtype函数可以返回数组中数据类型
>>> arr2.dtype dtype('int32')
zeros和ones分别可以创建指定形状的全0或者全1数组,empty可以创建一个没有任何具体值的数组,传入一个元组表示多维数组范围
>>> np.zeros((3,2)) array([[ 0., 0.], [ 0., 0.], [ 0., 0.]])>> > np.ones((4,4)) array([[ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.]])>> > np.empty((2,3)) array([[ 0., 0., 0.], [ 0., 0., 0.]])>> >
ones_like以另一个数组为参数,创建同样大小的全1数组:类似还有zeros_like,empty_like
np.ones_like(arr2) array([[1, 1, 1, 1], [1, 1, 1, 1]])>
eye函数创建单位矩阵
arange函数类似python内置的range函数:
>>> np.arange(15) array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
三:ndarray的数据类型
可以显示指定数组数据类型
>>> arr1=np.array([1,2,3],dtype=np.float64) >>> arr1.dtype dtype('float64')
可以通过ndarray的astype方法显示地转换其dtype
>>> arr=arr1.astype(np.float32) >>> arr array([ 1., 2., 3.], dtype=float32)
如果某字符串数组全是数字,也可以用astype将其转化为数值形式
>>> num_strings=np.array(['1.25','-9.6','42'],dtype=np.string_) >>> num_strings.astype(float) array([ 1.25, -9.6 , 42. ])
四:数组和标量之间的运算
arr*arr,arr-arr,1/arr,arr**0.5都是可以运算的。
五:基本的索引和切片
一维数组的操作和Python列表的功能差不多:
>>> np.arange(15) array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) >>> arr=np.arange(10) >>> arr array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> arr[5] 5 >>> arr[5:8]=12 >>> arr array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
跟列表最重要的区别是,数组切片是原始数组的视图,这意味着数据不会被复制,试图上的所有修改都会直接反映到原数组上。
如果要得到副本,可以用copy函数
>>> arr1=arr[5:8].copy() >>> arr1 array([12, 12, 12])
切片索引也跟Python列表的一维对象差不多。
可以利用整形数组进行索引:
>>> arr=np.empty((8,4)) >>> for i in range(8): ... arr[i]=i .. . >>> arr array([[ 0., 0., 0., 0.], [ 1., 1., 1., 1.], [ 2., 2., 2., 2.], [ 3., 3., 3., 3.], [ 4., 4., 4., 4.], [ 5., 5., 5., 5.], [ 6., 6., 6., 6.], [ 7., 7., 7., 7.]])>> > arr[[4,3,1,0]] array([[ 4., 4., 4., 4.], [ 3., 3., 3., 3.], [ 1., 1., 1., 1.], [ 0., 0., 0., 0.]])>> >
注意,这种方式跟切片不一样,会把数据复制到新数组之中。
六:数组的转置
转置方法.T
arr=np.arange(15).reshape((3,5)) >>> arr array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])>> > arr.T array([[ 0, 5, 10], [ 1, 6, 11], [ 2, 7, 12], [ 3, 8, 13], [ 4, 9, 14]])
计算矩阵内积XTX:
>>> arr=np.random.randn(6,3) >>> np.dot(arr.T,arr) array([[ 11.22401502, 4.2548458 , -2.84368601], [ 4.2548458 , 9.0673642 , -4.23048071], [ -2.84368601, -4.23048071, 3.89732813]])七:通用函数:对数组中每一个元素执行运算。
np.abs 求绝对值
np.sqrt 求各元素平方根
np.square 求各元素平方
np.exp 求各元素指数
log ,log10,log2 求对数
ceil 变成大于该值的最小整数
floor 变成小于该值的最大整数
isnan 返回一个表示哪些值是“NAN”的布尔型数组
add 两个数组对应相加(subtract,multiply,divide)
八:利用数组进行数据处理:
np.where函数是三元表达式x if condition else y的矢量化版本
>>> xarr=np.array([1.1,1.2,1.3,1.4,1.5]) >>> yarr=np.array([2.1,2.2,2.3,2.4,2.5]) >>> cond = np.array([True,False,True,True,False]) >>> result = np.where(cond,xarr,yarr) >>> result array([ 1.1, 2.2, 1.3, 1.4, 2.5])
where在数据分析中经常使用,通常用于根据一个数组产生另一个数组
>>> arr = np.random.randn(4,4) >>> arr array([[-0.88678735, 0.41149481, -0.55946983, 0.44320273], [-0.85065922, -0.89529666, -0.52700649, -0.13264943], [-0.52438978, -1.10277602, 0.56030451, 1.43615325], [-1.30382499, 0.3459263 , -1.52122709, 0.40608226]])>> > np.where(arr>0,2,arr) #只将正值设置为2 array([[-0.88678735, 2. , -0.55946983, 2. ], [-0.85065922, -0.89529666, -0.52700649, -0.13264943], [-0.52438978, -1.10277602, 2. , 2. ], [-1.30382499, 2. , -1.52122709, 2. ]])>
