数据分析与展示——NumPy库入门

这是我学习北京理工大学嵩天老师的《Python数据分析与展示》课程的笔记。嵩老师的课程重点突出、层次分明,在这里特别感谢嵩老师的精彩讲解。

NumPy库入门

数据的维度

维度是一组数据的组织形式。数据维度就是在数据之间形成特定关系表达多种含义的一个概念。

一维数据:

一维数据由对等关系的有序或无序数据构成,采用线性方式组织。对应列表、数组和集合等概念。

列表和数组:一组数据的有序结构。

区别:

  列表:数据类型可以不同

  数组:数据类型相同

二维数据:

二维数据由多个一维数据构成,是一维数据的组合形式。

表格是典型的二维数据。其中,表头是二维数据的一部分

多维数据:

多维数据由一维或二维数据在新维度上扩展形成。例如增加时间维度的表格

高维数据:

高维数据仅利用最基本的二元关系展示数据间的复杂结构。利用键值对将数据组织起来的形成的数据关系。

数据维度的Python表示

一维数据:列表(有序)和集合(无序)类型

二维数据:列表类型

多维数据:列表类型

高维数据:字典类型或数据表示格式(JSON、XML、YAML)

NumPy的数组对象:ndarray

NumPy是一个开源的Python科学计算基础库。NumPy提供了一个强大的N维数组对象ndarray,广播功能函数,整合C/C++/Fortran代码的工具,线性代数、傅里叶变换、随机数生成等功能。NumPy是SciPy、Pandas等数据处理或科学计算库的基础。

Numpy引用:
import numpy as np

尽管别名可以省略或更改,建议使用上述约定的别名

引入ndarray的好处:

范例:计算A2 + B3 ,其中,A和B是一维数组

def pySum():
    a = [0,1,2,3,4]
    b = [9,8,7,6,5]
    c = []

    for i in range(len(a)):
        c.append(a[i]**2 + b[i]**3)

    return c

print(pySum())
import numpy as np
def npSum():
    a = np.array([0,1,2,3,4])
    b = np.array([9,8,7,6,5])

    c = a**2 + b**3

    return c

print(npSum())

数组对象可以去掉元素间运算所需要的循环,使一维向量更像单个数据。设置专门的数组对象,经过优化,可以提升这类应用的运算速度。

观察:科学计算中,一个维度所有数据的类型往往相同。

数组对象采用相同的数据类型,有助于节省运算和存储空间。

N维数组对象:ndarray

ndarray是一个多维数组对象,由两部分构成:实际的数据、描述这些数据的元数据(数据维度、数据类型等)。ndarray数组一般要求所有元素类型相同(同质),数组下标从0开始。

使用np.array()生成一个ndarray数组(ndarray在程序中的别名是:array),np.array()输出成 [] 形式,元素由空格分割。

  • 轴(axis):保存数据的维度
  • 秩(rank):轴的数量

范例:生成一个ndarray数组

In [1]: import numpy as np

In [2]: a = np.array([[0,1,2,3,4],
   ...:             [9,8,7,6,5]])
   ...:             

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

In [4]: print(a)
    [[0 1 2 3 4]
    [9 8 7 6 5]]
ndarray对象的属性
属性说明
.ndim秩,即轴的数量或维度的数量
.shapendarray 对象的尺寸,对于矩阵,n行m列
.sizendarray对象元素的个数,相当于.shape中的n*m的值
.dtypendarray对象元素类型
.itemsizendarray对象中每个元素的大小,以字节为单位

范例:测试ndarray的属性

In [5]: a.ndim
Out[5]: 2

In [6]: a.shape
Out[6]: (2, 5)

In [7]: a.dtype
Out[7]: dtype('int32')

In [8]: a.itemsize
Out[8]: 4
ndarray的元素类型
数据类型说明
bool布尔类型,True或False
intc与C语言中的int类型一致,一般是int32或int64
intp用于索引的整数,与C语言sszie_t一致,int32或int64
int8字节长度的整数,取值:[-128,127]
int1616位长度的整数,取值:[-32768,32767]
int3232位长度的整数,取值:[-231,231-1]
int6464位长度的整数,取值:[-263,263-1]
uint88位无符号整数,取值:[0,255]
uint1616位无符号整数,取值:[0,255]
uint3232位无符号整数,取值:[0,232-1]
uint6464位无符号整数,取值:[0,264-1]
float1616位半精度浮点数:1位符号位,5位指数,10位尾数((符号)尾数*10指数
float3232位半精度浮点数:1位符号位,5位指数,23位尾数
float6464位半精度浮点数:1位符号位,11位指数,23位尾数
float6464位半精度浮点数:1位符号位,11位指数,52位尾数
复数:实部(.real) + j虚部(.imag)
complex64复数类型,实部和虚部都是32位浮点数
complex128复数类型,实部和虚部都是64位浮点数

对比:Python语法仅支持整数、浮点数和复数3种类型。ndarray支持多种元素类型的原因:

  • 科学计算涉及数据较多,对存储和性能都有较高要求。
  • 对元素类型精细定义,有助于Numpy合理使用存储空间并优化性能。
  • 对元素类型精细定义,有助于程序员对程序规模有合理评估。
非同质的ndarray对象

ndarray数组可以由非同质对象构成。非同质ndarray元素为对象类型,无法有效发挥Numpy优势,尽量避免使用。

范例:非同质的ndarray对象的类型为Object

In [9]: x = np.array([[0,1,2,3,4],
   ...:             [9,8,7,6] ])
   ...:             

In [10]: x.shape
Out[10]: (2,)

In [11]: x.dtype
Out[11]: dtype('O')

In [12]: x
Out[12]: array([list([0, 1, 2, 3, 4]), list([9, 8, 7, 6])], dtype=object)

In [13]: x.itemsize
Out[13]: 8

In [14]: x.size
Out[14]: 2

ndarray数组的创建和变换

ndarray数组的创建方法

(1)从Pyhton中的列表、元祖等类型创建ndarray数组。
x = np.array(list/tuple)
x = np.array(list/tuple,dtype=np.float32)

当np.array()不指定dtype时,NumPy将根据数据情况关联一个dtype类型。

范例:创建ndarray数组

In [15]: x = np.array([0,1,2,3])  # 从列表类型创建

In [16]: print(x)
[0 1 2 3]

In [17]: x = np.array((4,5,6,7))  # 从元组类型创建

In [18]: print(x) 
[4 5 6 7]

In [19]: x = np.array([[1,2],[9,8],(0.1, 0.2)])  # 从列表和元组混合类型创建

In [20]: print(x)
[[ 1.   2. ]
 [ 9.   8. ]
 [ 0.1  0.2]]
(2)使用Numpy中函数创建ndarray数组,如:arange,ones,zeros等。
函数说明
np.arange(n)类似range()函数,返回ndarray类型,元素从0到n-1
np.ones(shape)根据shape生成一个全1数组,shape是元组类型
np.zeros(shape)根据shape生成一个全0数组,shape是元组类型
np.full(shape,val)g根据shape生成一个数组,每个元素值都是val
np.eye(n)创建一个正方形的n*n单位矩阵,对角线为1,其余为0
np.ones_like(a)根据数组a的形状生成一个全1数组
np.zeros_like(a)根据数组a的形状生成一个全0数组
np.full_like(a,val)根据数组a形状生成一个数组,每个元素值都是val
使用Numpy中其他函数创建ndarray数组
np.linspace()根据起止数据等间距地填充数据,形成数组
np.concatenate()将两个或多个数组合并成一个新的数组

范例:创建ndarray数组

In [21]: np.arange(10)
Out[21]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [22]: np.ones((3,6))
Out[22]: 
array([[ 1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.]])

In [23]: np.zeros((3,6),dtype=np.int32)
Out[23]: 
array([[0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0]])

In [24]: np.eye(5)
Out[24]: 
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.]])

In [25]: x = np.ones((2,3,4))

In [26]: print(x)
[[[ 1.  1.  1.  1.]
  [ 1.  1.  1.  1.]
  [ 1.  1.  1.  1.]]

 [[ 1.  1.  1.  1.]
  [ 1.  1.  1.  1.]
  [ 1.  1.  1.  1.]]]

In [27]: x.shape
Out[27]: (2, 3, 4)

In [28]: a = np.linspace(1, 10, 4)

In [29]: a
Out[29]: array([  1.,   4.,   7.,  10.])

In [30]: b = np.linspace(1, 10, 4, endpoint=False)

In [31]: b
Out[31]: array([ 1.  ,  3.25,  5.5 ,  7.75])

In [32]: c = np.concatenate((a,b))

In [33]: c
Out[33]: array([  1.  ,   4.  ,   7.  ,  10.  ,   1.  ,   3.25,   5.5 ,   7.75])
(3)从字节流(raw bytes)中创建ndarray数组。
(4)从文件中读取特定格式,创建ndarray数组。

ndarray数组的变换

对于创建后的ndarray数组,可以对其进行维度变换和元素类型变换。

ndarray数组的维度变换
方法说明
.reshape(shape)不改变数组元素,返回一个shape形状的数组,原数组不变
.resize(shape)与.reshape()功能一致,但修改原数组
.swapaxes(ax1,ax2)将数组n个维度中两个维度进行调换
.flatten()对数组进行降维,返回折叠后的一维数组,原数组不变

In [34]: a = np.ones((2,3,4), dtype=np.int32) In [35]: a.reshape((3,8)) Out[35]: 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]]) In [36]: a Out[36]: 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]]]) In [37]: a.resize((3,8)) In [38]: a Out[38]: 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]]) In [39]: a = np.ones((2,3,4), dtype=np.int32) In [40]: a.flatten() Out[40]: 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]) In [41]: a Out[41]: 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]]]) In [42]: b = a.flatten() In [43]: b Out[43]: 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])
ndarray数组的类型变换
new_a = a.astype(new_type)

范例:数组类型变换

In [44]: a = np.ones((2,3,4), dtype=np.int)

In [45]: a
Out[45]: 
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]]])

In [46]: b = a.astype(np.float)

In [47]: b
Out[47]: 
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.]]])

astype()方法一定会创建新的数组(原始数据的一个拷贝),即使两个类型一致。

ndarray数组向列表的转换
ls = a.tolist()

范例:ndarray数组向列表的转换

In [48]: a = np.full((2,3,4), 25, dtype=np.int32)

In [49]: a
Out[49]: 
array([[[25, 25, 25, 25],
        [25, 25, 25, 25],
        [25, 25, 25, 25]],

       [[25, 25, 25, 25],
        [25, 25, 25, 25],
        [25, 25, 25, 25]]])

In [50]: a.tolist()
Out[50]: 
[[[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]],
 [[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]]]

ndarray数组的操作

数组的索引和切片

索引:获取数组中特定位置元素的过程

切片:获取数组元素子集的过程

一维数组的索引和切片:与Python的列表类似

In [51]: a = np.array([9,8,7,6,5])

In [52]: a[2]
Out[52]: 7

In [53]: a[1:4:2]     # 起始编号 : 终止编号(不含) : 步长(3元素冒号分割),编号0开始从左递增,或-1开始从右递减
Out[53]: array([8, 6])

多维数组的索引:

In [54]: a = np.arange(24).reshape((2,3,4))

In [55]: a
Out[55]: 
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]]])

In [56]: a[1,2,3]         # 每个维度一个索引值,逗号分割
Out[56]: 23

In [57]: a[0,1,2]
Out[57]: 6

In [58]: a[-1,-2,-3] 
Out[58]: 17
多维数组的切片:
In [59]: a[: , 1, -3]         # 选取一个维度用
Out[59]: array([ 5, 17])

In [60]: a[: , 1:3, :]         # 每个维度切片方法与一维数组相同
Out[60]: 
array([[[ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[16, 17, 18, 19],
        [20, 21, 22, 23]]])

In [61]: a[: , :, ::2]         # 每个维度可以使用步长跳跃切片
Out[61]: 
array([[[ 0,  2],
        [ 4,  6],
        [ 8, 10]],

       [[12, 14],
        [16, 18],
        [20, 22]]])

ndarray数组的运算

数组与标量之间的运算

数组与标量之间的运算作用于数组的每一个元素

范例:计算a与元素平均值的商

In [62]: a.mean()
Out[62]: 11.5

In [63]: a = a/a.mean()

In [64]: a
Out[64]: 
array([[[ 0.        ,  0.08695652,  0.17391304,  0.26086957],
        [ 0.34782609,  0.43478261,  0.52173913,  0.60869565],
        [ 0.69565217,  0.7826087 ,  0.86956522,  0.95652174]],

       [[ 1.04347826,  1.13043478,  1.2173913 ,  1.30434783],
        [ 1.39130435,  1.47826087,  1.56521739,  1.65217391],
        [ 1.73913043,  1.82608696,  1.91304348,  2.        ]]])
Numpy一元函数

对ndarray中的数据执行元素级运算的函数

函数说明
np.abs(x) np.fabs(x)计算数组各元素的绝对值
np.sqrt(x)计算数组各元素的平方根
np.square(x)计算数组各元素的平方
np.log(x) np.log10(x) np.log2(x)计算数组各元素的自然对数、10底对数和2底对数
np.ceil(x) np.floor(x)计算数组各元素的ceiling值或floor值
np.rint(x)计算数组各元素的四舍五入值
np.modf(x)将数组各元素的小数
np.cos(x) np.cosh(x)
np.sin(x) np.sinh(x)
np.tan(x) np.tanh(x)
计算数组各元素的普通型和双曲型三角函数
np.exp(x)计算数组各元素的指数值
np.sign(x)计算数组各元素的符号值,1(+),0,-1(-)

范例:一元函数实例

In [65]: a = np.arange(24).reshape((2,3,4))

In [66]: np.square(a)
Out[66]: 
array([[[  0,   1,   4,   9],
        [ 16,  25,  36,  49],
        [ 64,  81, 100, 121]],

       [[144, 169, 196, 225],
        [256, 289, 324, 361],
        [400, 441, 484, 529]]], dtype=int32)

In [67]: a = np.sqrt(a)

In [68]: a
Out[68]: 
array([[[ 0.        ,  1.        ,  1.41421356,  1.73205081],
        [ 2.        ,  2.23606798,  2.44948974,  2.64575131],
        [ 2.82842712,  3.        ,  3.16227766,  3.31662479]],

       [[ 3.46410162,  3.60555128,  3.74165739,  3.87298335],
        [ 4.        ,  4.12310563,  4.24264069,  4.35889894],
        [ 4.47213595,  4.58257569,  4.69041576,  4.79583152]]])

In [69]: np.modf(a)
Out[69]: 
(array([[[ 0.        ,  0.        ,  0.41421356,  0.73205081],
         [ 0.        ,  0.23606798,  0.44948974,  0.64575131],
         [ 0.82842712,  0.        ,  0.16227766,  0.31662479]],
 
        [[ 0.46410162,  0.60555128,  0.74165739,  0.87298335],
         [ 0.        ,  0.12310563,  0.24264069,  0.35889894],
         [ 0.47213595,  0.58257569,  0.69041576,  0.79583152]]]),
 array([[[ 0.,  1.,  1.,  1.],
         [ 2.,  2.,  2.,  2.],
         [ 2.,  3.,  3.,  3.]],
 
        [[ 3.,  3.,  3.,  3.],
         [ 4.,  4.,  4.,  4.],
         [ 4.,  4.,  4.,  4.]]]))
NumPy二元函数
函数说明
+ - * / **两个数组各元素进行对应运算
np.maximum(x,y) np.fmax()
np.minimum(x,y) np.fmin()
元素级的最大值/最小值计算
np.mod(x,y)元素级的模运算
np.copysign(x,y)将数组y中各元素值的符号赋值给数组x对应元素
> < >= <= == !=算术比较,产生布尔型数组

范例:NumPy二元函数

In [70]: a = np.arange(24).reshape((2,3,4))

In [71]: b = np.sqrt(a)

In [72]: a
Out[72]: 
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]]])

In [73]: b
Out[73]: 
array([[[ 0.        ,  1.        ,  1.41421356,  1.73205081],
        [ 2.        ,  2.23606798,  2.44948974,  2.64575131],
        [ 2.82842712,  3.        ,  3.16227766,  3.31662479]],

       [[ 3.46410162,  3.60555128,  3.74165739,  3.87298335],
        [ 4.        ,  4.12310563,  4.24264069,  4.35889894],
        [ 4.47213595,  4.58257569,  4.69041576,  4.79583152]]])

In [74]: np.maximum(a,b)
Out[74]: 
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.]]])

In [75]: a > b
Out[75]: 
array([[[False, False,  True,  True],
        [ True,  True,  True,  True],
        [ True,  True,  True,  True]],

       [[ True,  True,  True,  True],
        [ True,  True,  True,  True],
        [ True,  True,  True,  True]]], dtype=bool)

NumPy数据存取与函数

转载于:https://www.cnblogs.com/yan-lei/p/7768851.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值