数据处理———numpy库narray的创建和常用函数
在使用numpy库之前必须先导入numpy模块
>>>import numpy as np
- 先看如何创建一个数组(narray)对象
最基础的方法就是直接用array()来创建一个数组对象:
>>>np.array([1,2,3]) #一维数组
array([1, 2, 3])
>>>np.array([[1,2,3],[4,5,6],[7,8,9]]) #二维数组
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> a=np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>>print(a)
[[1 2 3] #print后显示出的数组
[4 5 6]
[7 8 9]]
还有其他一些特殊的创建方法(zeros,ones,full,eye,arange,):
顾名思义,zeros()与ones()函数就是分别用来创建全是0或全是一的数组,主要参数是数组的shape(后面会讲到),用法如下:
>>>np.zeros(5) #一维数组直接加上数组的size
array([0.,0.,0.,0.,0.])
>>>np.zeros((3,4)) #多维数组则给定数组的shape
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
>>>np.ones((3,3,3)) #例如用ones()函数创建一个shape为(3,3,3)的全为1三维数组
array([[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]]])
full()函数用来创建指定值的数组,主要参数为shape,fill_value,此外还有dtype用来指定数组所存内容的类型(与python列表不同,一个narray中所存数据必须是同一类型是数据,前面所有创建函数均可给定ntype这个参数,不给定时会有默认值,每个函数默认值可能不同),full用法如下:
>>> np.full((3,4),9) #创建一个shape为(3,4),数值全为9的数组
array([[9, 9, 9, 9],
[9, 9, 9, 9],
[9, 9, 9, 9]])
还有一个特殊narrary的创建函数时eye(),用于创建单位矩阵,用法如下:
>>>np.eye(5)
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
arange()函数可以用来创建数组(函数参数为arange([start,] stop[, step,], dtype=None)),与python自带的range函数基本一样,只是多了一个dtype函数,示例如下:
>>>np.arange(5)
array([0, 1, 2, 3, 4])
>>>np.arange(1,11,2) #step=2
array([1, 3, 5, 7, 9])
>>>np.arange(1,13).reshape((3,4)) #reshape函数在后面会讲到
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
其实还有很多数组的创建方法,比如用np.random函数来创建随机数组数据(包括符合正态分布或贝塔分布的数据)等。
- 一些对于ndarray常用的操作函数
最基本的操作就是对特定值的修改,这里我们可以直接通过某个值的下标,对其进行修改,例如:
>>> a=np.arange(12).reshape((3,4))
>>> print(a)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
>>> a[1][1]=12 #特殊地,这里的下标也可以写成[1,1]这种形式
>>> print(a)
[[ 0 1 2 3]
[ 4 12 6 7]
[ 8 9 10 11]]
基本运算(加减乘除和乘方),直接看例子:
>>> a+1 #对一个ndarray对象直接进行这些基本运算就相当于
array([[ 1, 2, 3, 4], 对数组中存放的所有数据进行相应的操作
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
>>> a-1
array([[-1, 0, 1, 2],
[ 3, 4, 5, 6],
[ 7, 8, 9, 10]])
>>> a*2
array([[ 0, 2, 4, 6],
[ 8, 10, 12, 14],
[16, 18, 20, 22]])
>>> a/2
array([[0. , 0.5, 1. , 1.5],
[2. , 2.5, 3. , 3.5],
[4. , 4.5, 5. , 5.5]])
>>> a**3
array([[ 0, 1, 8, 27],
[ 64, 125, 216, 343],
[ 512, 729, 1000, 1331]], dtype=int32)
当然这些运算符号也可以进行矩阵之间的加减乘除,例如:
>>> a=np.arange(12).reshape((3,4))
>>> a=np.arange(12).reshape((3,4))
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
>>> b=np.arange(1,13).reshape((3,4))
>>> print(b)
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
>>> print(a+b)
[[ 1 3 5 7]
[ 9 11 13 15]
[17 19 21 23]]
可能经常用到的函数有:转置矩阵(T):
>>>a=np.arange(12).reshape((3,4)) #用例如a.T的方法来获取该矩阵的转置矩阵
>>>print(a)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
>>>print(a.T)
>>>[[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
最大值、最小值和平均数函数(max,min 和 mean),这三个函数的参数相同,主要需要传入的参数是axis(维度),例如:
>>>a=np.arange(12).reshape((3,4))
>>>print(a.min()) #没有给定参数时,返回**整个矩阵**所有数据的最小值
0
>>>print(a.max(0)) #给定维度0,返回存有矩阵**每列数据**最大值的数组
>>>print(a.mean(1)) #给定维度1,返回存有**每行数据**平均值的数组
矩阵的复制(copy()),当想要创建一个与已有矩阵相同的矩阵时,你可能会想到有‘=’进行一个赋值,当ndarray有其独特的函数copy():
>>>a=np.arange(12).reshape((3,4))
>>>b=a
>>>print(a,'\n\n',b)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
>>>a[1,1]=12
>>>print(a,'\n\n',b) #可见直接用=对新矩阵赋值,虽然看似时复制
[[ 0 1 2 3] 成功了,但是当老矩阵中的值发生改变
[ 4 12 6 7] 时,新矩阵中对应的值也
[ 8 9 10 11]] 会跟着改变,显然不是我们想要的效果
[[ 0 1 2 3]
[ 4 12 6 7]
[ 8 9 10 11]]
#然而当使用copy函数时就可以避免这个问题
c=a.copy()
a[1,1]=5
>>> print(a,'\n\n',c)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[ 0 1 2 3]
[ 4 12 6 7]
[ 8 9 10 11]]
reshape函数,用以给矩阵一个新的形状(行数,列数):
>>>a=np.arange(12)
>>>print(a.shape,'\n\n',a)
(12,)
[ 0 1 2 3 4 5 6 7 8 9 10 11]
>>>b=a.reshape((3,4))
>>>print(b.shape,'\n\n',b)
(3, 4)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]