本文是学习《利用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. ]])>