20.Python数据分析基础-NumPy

20.1 NumPy介绍

NumPy是Python的一种开源的数值计算扩展库。它包含很多功能:

  • 创建n维数组(矩阵)

  • 对数组进行函数运算

  • 数值积分

  • 线性代数运算

  • 傅里叶变换

  • 随机数产生
    ······


  • NumPy是在1995年诞生的Python库Numeric的基础上建立起来的。但真正促使NumPy的发行的是Python的SciPy库。

  • SciPy是2001年发行的一个类似于Matlab,Maple,Mathematica等数学计算软件的Python库,它实现里面的大多数功能。


  • NumPy提供了两种基本的对象:

  • ndarray:全称(n-dimensional array object)是储存单一数据类型的多维数组。

  • ufunc:全称(universal function object)它是一种能够对数组进行处理的函数。

  • NumPy的官方文档:
    https://docs.scipy.org/doc/numpy/reference/

  • ndarray 对象

    • ndarray的创建
    • ndarray的属性
    • ndarray的切片
    • 多维数组
    • 结构数组

20.1.1 Ndarray的创建

  • NumPy中的核心对象是ndarray。
  • ndarray可以看成数组,类似于R语言的向量或者矩阵。
  • NumPy里面所有的函数都是围绕ndarray展开的。
  • ndarray对维数没有限制。
    • [ ]从内到外分别为第0轴,第1轴,第2轴。
    • c第0轴长度为3,第1轴长度为4。
  • NumPy提供了专门用于生成ndarray的函数,提高创建ndarray的速度。


  • 还可以自定义函数产生ndarray。
  • fromfunction第一个参数接收计算函数,第二个参数接收数组的形状。

20.1.2 Ndarray的属性

  • ndarray的元素具有相同的元素类型。常用的有int(整型),float(浮点型),complex(复数型)。
  • ndarray的shape属性用来获得它的形状,也可以自己指定。

20.1.3 Ndarray切片

  • ndarray的切片和list是一样的。
  • 可以通过切片的对ndarray中的元素进行更改。
  • ndarray通过切片产生一个新的数组b,b和a共享同一块数据存储空间。
  • 如果想改变这种情况,我们可以用列表对数组元素切片。

20.1.4 多维数组

  • NumPy的多维数组和一维数组类似。多维数组有多个轴。
    • 我们前面已经提到从内到外分别是第0轴,第1轴…
  • 如果我们想创立原数组的副本,我们可以用整数元组,列表,整数数组,布尔数组进行切片


20.1.5 结构数组

  • C语言中可以通过struct关键字定义结构类型。
  • NumPy中也有类似的结构数组。

20.2 Ufunc函数

20.2.1 Ufunc简介

  • ufunc是universal function的简称,它是一种能对数组每个元素进行运算的函数。
  • 值得注意的是,对于同等长度的ndarray,np.sin()比math.sin()快
    • 但是对于单个数值,math.sin()的速度则更快。

20.2.2 四则运算

  • NumPy提供了许多ufunc函数,它们和相应的运算符运算结果相同。


20.2.3 比较运算和布尔运算

  • 使用==,>对两个数组进行比较,会返回一个布尔数组,每一个元素都是对应元素的比较结果。
  • 布尔运算在NumPy中也有对应的ufunc函数。


20.2.4 自定义ufunc函数

  • NumPy提供的标准ufunc函数可以组合出复合的表达式,但是有些情况下,自己编写的则更为方便。
  • 我们可以把自己编写的函数用frompyfunc()转化成ufunc函数。
  • 使用frompyfunc()进行转化
    • func:计算函数
    • nin:func()输入参数的个数
    • nout:func()输出参数的个数
  • 因为最后输出的元素类型是object,所以我们还需要把它转换成整型。

20.2.5 广播(broadcasting)

  • 使用ufunc对两个数组进行运算时,ufunc函数会对两个数组的对应元素进行运算。如果数组的形状不相同,就会进行下广播处理。
  • 简而言之,就是向两个数组每一维度上的最大值靠齐


20.3 随机数

  • NumPy产生随机数的模块在random里面,其中有大量的分布。


20.4 求和、平均值、方差

  • NumPy在均值等方面常用的函数如下:


  • keepdims可以保持原来数组的维数。

20.5 大小与排序

  • NumPy在排序等方面常用的函数如下:


  • min,max都有axis,out,keepdims等参数
  • sort()对数组进行排序会改变数组的内容,返回一个新的数组。
  • percentile计算处于p%上的值。

20.5 统计函数

  • NumPy中常用的统计函数有:unique(), bicount(), histogram()。
    • unique有两个参数,return_index=True同时返回原始数组中的下 - 标,return_inverse=True表示原始数据在新数组的下标。
    • bincount()对非负整数数组中的各个元素出现的次数进行统计,返回数组中的第i个元素是整数i出现的次数。
  • histogram()对以为数组进行直方图统计,其参数为:
    • histogram(a, bins=10, range=None, weights=None)函数返回两个一维数组,hist是每个区间的统计结果, bin_edges返回区间的边界值。

20.6 操作多维数组

  • 多维数组可以进行连接,分段等多种操作。
    • vstack()函数
    • hstack()函数
    • column_stack()函数。
    • split()函数进行分段。

20.7 多项式函数

  • 多项式也可以进行积分和求导。
  • Roots可以求多项式的根。
  • polyfit()可以对数据进行多项式拟合。x, y为数据点,deg为多项式最高阶数。
  • poly()返回多项式系数构成的数组。

20.8 实验

In:

import numpy as np

数组创建
In:

a1 = np.array([1,2,3])

In:

a1.shape

out:

(3,)

In:

a2 = np.array([[1,2,3],[4,5,6]])
a2.shape

out:

(2, 3)

In:

a3 = np.arange(0,10,1)
a3

out:

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In:

np.linspace(0,10,5)

out:

array([ 0. ,  2.5,  5. ,  7.5, 10. ])

In:

np.zeros(10)

out:

array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

In:

a3.dtype

out:

dtype('int32')

In:

a2.reshape(3,2)

out:

array([[1, 2],
       [3, 4],
       [5, 6]])

UFUNC
In:

np.greater_equal(np.array([1,2,3]),np.array([0,0,6]))

out:

array([ True,  True, False])

In:

a3.dtype

out:

dtype('int32')

In:

a4 = a3.astype(np.float)
a4.dtype

out:

dtype('float64')

随机数
In:

np.random.randint(5,size=10)  #5是范围

out:

array([3, 3, 2, 4, 4, 1, 2, 1, 1, 1])

In:

np.random.normal(0,1,100) #正太分布,均值为0,方差为1,100个数

out:

array([-0.80861078, -2.07749691,  0.29377679, -1.96900312, -1.25783093,
       -0.99607882, -0.87248032, -2.26714699,  1.30187567,  0.10194601,
       -0.42405655, -1.59441604, -2.31300876,  0.69700842, -0.65660689,
        0.01491257,  0.24889131,  0.3133219 ,  1.09196143, -2.45041751,
       -0.71471691, -0.26187846, -1.93342864, -0.21497748, -0.20100491,
       -0.73638216,  1.08467604,  0.53403982, -0.03887703,  1.12471892,
        0.78003454,  0.44594115, -0.17300147, -0.09442446, -0.93177358,
        1.71758462,  0.88627094,  0.70998374, -1.06083069,  0.28917184,
        0.62578472, -1.35847831, -0.82151136, -2.50524439,  0.13409251,
        1.95447607, -0.66078128, -0.54954445,  0.18099372,  0.63007529,
       -0.32250372,  0.19161832, -0.03845566,  1.42156815, -0.60922562,
        0.35661966, -0.94926617, -0.07052227,  1.28500753,  0.83647684,
       -0.08366194, -0.07888412, -0.75984669,  0.68073513,  0.24847929,
        0.06411332, -0.42888773, -0.4308731 ,  0.28863559, -0.39317157,
        0.6535631 , -1.03377091,  0.82276069,  0.62719534,  0.60430812,
       -0.66642475, -0.82981853, -0.23608257, -0.79722868, -0.04271116,
       -1.4547114 , -0.36257698, -1.51886097,  0.82684717, -0.52092058,
       -0.26407561, -1.26248144,  1.03907498,  1.10227367, -1.44444213,
        2.77433472,  1.16802956, -0.40984097, -0.77560109, -0.09912853,
       -0.54654941,  0.24287845, -0.84331085, -0.65950241, -0.08166242])

In:

np.random.uniform(-1,2,10) #均匀分布,-1是最低值,2是最高值

out:

array([ 1.62022332, -0.10385265,  1.7091309 , -0.74307353,  0.82105525,
        1.9984005 ,  1.2537413 ,  0.19649023,  0.27706096, -0.13709349])

In:

a3
np.random.shuffle(a3)
print(a3)

out:

[9 5 0 3 4 1 2 7 6 8]

In:

np.random.choice(10,4) #10表示范围,4表示个数

out:

array([6, 2, 3, 0])

In:

a3.mean()
np.average(a3)

out:

4.5

In:

# a3.sum()
np.sum(a3)

out:

45

In:

np.product(a3)

out:

0

In:

np.ptp(a3) #9-0

out:

9

In:

print(a3,a4)

out:

[9 5 0 3 4 1 2 7 6 8] [0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]

In:

np.minimum(a3,a4)

out:

array([0., 1., 0., 3., 4., 1., 2., 7., 6., 8.])

In:

np.percentile(a3,25) #25代表中位,排序后

out:

2.25

In:

np.percentile(a4,25)

out:

2.25

In:

np.median(a3) #中位数 (4+5)/2,排序后

out:

4.5

In:

a1 = np.array([1,2,'a','hello',[1,2,3],{'one':100,'two':200}])
a1.shape

out:

(6,)

In:

list('abcdef')

out:

['a', 'b', 'c', 'd', 'e', 'f']

In:

a2 = np.array([list(range(6)),list('abcdef'),
              [True,False,True,False,True,True]])

In:

a2.shape

out:

(3, 6)

In:

np.arange(5,15)

out:

array([ 5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

In:

np.zeros((4,4))

out:

array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])

In:

np.ones((2,3))

out:

array([[1., 1., 1.],
       [1., 1., 1.]])

In:

np.eye(3) #生成对角阵

out:

array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

In:

print(a3)
a3[[3,3,-3,8]]

out:

[0 1 2 3 4 5 6 7 8 9]
array([3, 3, 7, 8])

In:

np.arange(25).reshape(5,5)

out:

array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

In:

a21 = np.arange(20)

In:

a21.reshape(4,5)

out:

array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

In:

np.resize(a21,(5,6))

out:

array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19,  0,  1,  2,  3],
       [ 4,  5,  6,  7,  8,  9]])

In:

np.arange(16).reshape(4,4).astype(np.str)

out:

array([['0', '1', '2', '3'],
       ['4', '5', '6', '7'],
       ['8', '9', '10', '11'],
       ['12', '13', '14', '15']], dtype='

In:

ar6 = np.arange(10).reshape(2,-1)
ar6[ar6>5]

out:

array([6, 7, 8, 9])

你可能感兴趣的:(20.Python数据分析基础-NumPy)