Python Numpy使用

Python的第三方扩展库,是其他数据分析模块的基础,主要用于数组、矩阵计算(比列表快得多)等方面

安装

pip install numpy

常用方法

array()

创建数组,举例:
创建一维数组:numpy.array([x,y,...])
二维数组:numpy.array([[x,y...],[x,y...],[x,y...])
注:
创建的数组如果想看格式(几行几列),就通过array.shape来看就行了
注2:
数组创建后大小就固定了,所以如果想要进行增删改查则可以参考如下方法:

  • 增:使用tile()扩展、vstack()合并、转成列表操作再转回来(参考后面)
  • 删:可以直接像a=a[0],那么就只有一行了、分片操作
  • 改:直接改
  • 查:直接查
sort()

排序,正常排,遇到无法排序的放最后,举例:

>>> x = numpy.array([1,3,2,'a',5])
>>> x
array(['1', '3', '2', 'a', '5'], dtype='<U11')  #排序前
>>> x.sort()
>>> x
array(['1', '2', '3', '5', 'a'], dtype='<U11')  #排序后

注:
二维数组排序只排每一行里面的,其他行之间互不干扰

max()

求最大值,如果在二维数组中,每行的列数相等,那么最大值就是所有元素里最大的,举例:

>>> x = numpy.array([[1,2,3,5],[1,2,0,0],[5,8,23,1]])
>>> x.max()
23

但如果每行列数不同,返回的就是数开头最大的那一行(假如第一个一样,再比第二个…),举例:

>>> x = numpy.array([[3,2,1,4,10],[1,2,0,0],[3,6,9,1]])
>>> x.max()
[3, 6, 9, 1]

注:
最小值min(),平均值是mean(),加权平均值是average(),标准差是std()

[:]

数组切片,参考列表,举例:

>>> b = numpy.array([1,2,3,4,5])
>>> b[1:3]
array([2, 3])
>>> a = numpy.array(([1,2,3,4],[5,6,7,8],[9,10,11,12]))
>>> a[1:]
array([[ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])
>>> a[:][1]  #切出所有行,取第2个
array([5, 6, 7, 8])
>>> a[:][1:]    #切出所有行,取第二个2到最后一个
array([[ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

可以看出上面只能切出行而不能切分列(其将行看作整体来切分),所以推荐使用下面的针对数组特殊的切片方法来切分行列,格式:[:,:],在一个括号里写分片,逗号分隔行列,举例:

>>> a = numpy.array(([1,2,3,4],[5,6,7,8],[9,10,11,12]))
>>> a[1:, 1]  #取第二、三行的第二列数据
array([ 6, 10])
>>> a[:, 0:3]  #取所有行的第一列到第三列数据
array([[ 1,  2,  3],
       [ 5,  6,  7],
       [ 9, 10, 11]])
random.random_integers(x,y,n)

随机数生成,前两个参数代表范围,第三个为可选,表示生成数量,比如:

>>> numpy.random.random_integers(1,10,10) #随机生成10个1到10的随机数
array([ 6,  5,  7,  6,  5,  4,  9,  9, 10,  5])

上面那个是生成整数的随机数,还有rand()用来生成0到1之间的随机数,中间可以加参数代表生成几个,举例:

>>> numpy.random.rand(10)   #生成10个0-1的随机数
array([0.42462596, 0.0985224 , 0.22108224, 0.46230285, 0.40928969,
       0.54201574, 0.88982411, 0.8450716 , 0.21384846, 0.38896833])
random.random.normal(μ,σ,n)

生成一堆符合正态分布的数,第一个参数是均值,第二个参数是标准差,第三个参数是生成数,举例:

>>> a = numpy.random.normal(0,1,10)
>>> a
array([-0.55491277, -1.1161704 ,  0.97514814,  1.99653332, -0.08500584,
        0.64075696,  1.96409159, -0.11636198,  0.52605946,  0.90563603])
>>> a.mean()
0.513577451404013
>>> a.std()
0.9612030098851562
#当生成的数多了,精度自然也会提高

更多numpy.random参考:
http://www.mamicode.com/info-detail-507676.html

arange()

类似range,前两个参数代表范围,第三个代表阶值类似range,举例:

>>> numpy.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> numpy.arange(1,10,2)
array([1, 3, 5, 7, 9])

注:
发现了吗,像python自带的randomrange虽然和这些几乎一样,但有个区别就是numpy下的这几个方法生成的都是array类型的,原来那些都是list类型

concatenate()

将数组整合在一起,数组不像列表那样可以直接加着整合,比如列表里:

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> a+b
[1, 2, 3, 4, 5, 6]
>>> a*2
[1, 2, 3, 1, 2, 3]

从上面可以看出对列表进行运算都是把列表当成整体来运算,而对于数组里:

>>> a = numpy.array([1,2,3])
>>> b = numpy.array([4,5,6])
>>> a + b
array([5, 7, 9])
>>> a * 2
array([2, 4, 6])

可以看出对数组的运算是对他里面的值进行运算,因此要对数组进行列表那样的操作,就需要用上面那个方法,对上面的a、b举例:

>>> numpy.concatenate((a, b))  #以元组形式传入
array([1, 2, 3, 4, 5, 6])
sum()

计算总和,举例:

>>> numpy.sum([1,2,3])
6

上面的是对行内相加,如果是多行数据,并且希望是各行的对应数据之间相加,可以设置参数:axis=0(默认为1,即行内相加),举例:

>>> a = numpy.array([[1,2,3,4], [5,6,7,8], [1, 2, 3, 4]])
>>> a.sum()  #全部数据之和
46
>>> a.sum(axis=0)  #各行对应数据之和
array([ 7, 10, 13, 16])

注:
其他计算操作如:求对数用numpy.log(),向上取整用numpy.ceil(),比如3.1就变成4

unique()

去重,举例:

>>> numpy.unique([1,2,3,1,2,3,5,6,4])
array([1, 2, 3, 4, 5, 6])
>>> numpy.unique(numpy.array([1,2,3,1,2,3,5,6,4]))  #对数组、列表都可以,但最终都是变成数组
array([1, 2, 3, 4, 5, 6])
drop()

丢弃

fillna()

对丢失值的填充

tile()

复制扩展数组,有两个参数,第一个是要复制扩展的数组,第二个参数是个元组,意思是变成几行几列,举例:

>>> a = numpy.array([1,2,3,4])
>>> numpy.tile(a, 2)  #此时第二个参数相当于(1,2),即扩展成1行2列(x轴变成原来2倍)
array([1, 2, 3, 4, 1, 2, 3, 4])

第二个参数的元组有几位,就代表几维,一般都是用二维,即两个值,代表几行几列,在列上扩展举例1:

>>> numpy.tile(a, (2, 1))  #扩展成2行1列
array([[1, 2, 3, 4],
       [1, 2, 3, 4]])

其还能扩展到更多维,如三维举例:

>>> numpy.tile(a, (3, 2, 1))  #在三维下,分3组,每组2行1列
array([[[1, 2, 3, 4],
        [1, 2, 3, 4]],
       [[1, 2, 3, 4],
        [1, 2, 3, 4]],
       [[1, 2, 3, 4],
        [1, 2, 3, 4]]])

四维举例:

>>> numpy.tile(a, (2, 3, 3, 2)) #在4维下,分2组,每组3个,每个3行2列
array([[[[1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4]],
        [[1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4]],
        [[1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4]]],
       [[[1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4]],
        [[1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4]],
        [[1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4]]]])

发现了吗,可以这样理解第二个参数,那就是元组的最后两个数代表变成原来的几行几列,前面的数都是分多少组多少个,比如三维的3个数分别代表:几组几行几列;四维分别代表:几组几个几行几列;五维:几组几个几块几行几列;六…(单位是瞎编的,但是意思没错)

zero()

生成一个自定义大小值全为0的数组,传入参数是一个列表或元组,代表几行几列,举例:

>>> numpy.zeros([2,5])
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])

其传入的列表也可以是多维的,比如:

>>> numpy.zeros([2,2,5])  #2组,每组2行5列
array([[[0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]],
       [[0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]]])

多维的用法和tile()函数的基本一样,参考上面即可
注:
numpy里还有生成一个自定义大小值全为1的数组放方法:ones(),还有值都为空的数组:empty()

vstack()

将两个数组合并,举例:

>>> c = numpy.array(([1,2],[3,4]))
>>> d = numpy.array(([5,6],[7,8]))
>>> numpy.vstack((c,d))
array([[1, 2],
       [3, 4],
       [5, 6],
       [7, 8]])
linspace()

生成一个等差数列,举例:

>>> np.linspace(-1,1,5, dtype=np.float32)  # -1到1分成5份的等差数列
array([-1. , -0.5,  0. ,  0.5,  1. ], dtype=float32)
newaxis

如果直接输出,你会发现他就是None(源码里就是newaxis = None),但是他常被用来添加一个新的维度,比如一维向量变二维矩阵,二维则变三维等等,可能因为None在这里有这个功能,因为为了方便阅读程序而设置了一个别名,使用举例:

>>> np.newaxis == None  # 可以发现他就是None
True
>>> x = np.array([1,2,3,4])
>>> x
array([1, 2, 3, 4])
>>> x.shape  # 可以看出是一维的向量
(4,)
>>> x[:, np.newaxis]
array([[1],
       [2],
       [3],
       [4]])
>>> x[:, np.newaxis].shape  # 变成二维了
(4, 1)

你或许想:《去原作者写文章的地方

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论