Python学习笔记:NumPy入门

一、NumPy概述

NumPy(Numerical Python)是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(Nested List Structure)结构要高效得多,该结构也可以用来表示矩阵(Matrix),支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库 。

NumPy数组占用内存比Python内置序列要少得多,数组运算无须Python的for循环,当然计算效率更更高。
在这里插入图片描述

二、多维数组对象

NumPy的ndarray是保存Python大数据集的快速灵活的容器。NumPy数组运算类似于Python标量运算。

  • 创建一个二行三列的二维随机数组
    在这里插入图片描述

  • 进行翻倍运算
    在这里插入图片描述

  • 进行自相加运算
    在这里插入图片描述

  • 如果换成Python的二维列表来处理翻倍运算,那就会十分繁琐,演示如下:
    在这里插入图片描述

  • 由上可知,如果二维列表乘上2,不是每个元素翻倍,而是将元素个数翻倍了,由两行三列扩展成四行三列,前两行与后两行完全相同。

  • 正确的做法如下所示:先通过嵌套列表解析得到元素翻倍的普通列表,然后再将普通列表转换成二维列表。
    在这里插入图片描述

  • 一个ndarray是一个同类型数据的通用多维容器,那就是说数组的所有元素必须是相同类型。每一个数组都有一个shape属性,表示每维大小的元组,还有一个dtype属性,描述数组的数据类型。
    在这里插入图片描述

三、创建NumPy多维数组

1、利用array()函数创建NumPy数组

  • array()函数接收任何序列对象,或者其它数组。

  • 由列表创建NumPy一维数组
    在这里插入图片描述

  • 由嵌套列表创建NumPy二维数组
    在这里插入图片描述

  • 由嵌套列表data2生成的数组arr2是二维数组,三行四列,可以通过shape、dtype和ndim属性来获取相关信息;除非显式指定,np.array试图推断出它所创建数组的类型。数据类型保存在dtype元数据对象里。

在这里插入图片描述

2、创建NumPy数组的其它函数

  • 除了用np.array,还有不少其它创建新数组的函数,比如zeros、ones、empty函数,要用这些方法创建高维数组,传入一个元组指定数组的shape。

(1)利用zeros函数创建元素全为0的数组

在这里插入图片描述

(2)利用ones函数创建元素全为1的数组

在这里插入图片描述

(3)利用empty函数创建数组

在这里插入图片描述

  • 假定np.empty会返回全1或全0的数组,在某些情况下,可能会返回没有初始化的垃圾值。

(4)arange函数是Python内置函数range的数组值版本

在这里插入图片描述

  • NumPy专注于数值计算,如果不指定,整数默认类型是int32,实数默认类型是float64。
    在这里插入图片描述
  • 当然在创建数组时可以根据需要指定数组类型
    在这里插入图片描述

3、创建数组函数表

在这里插入图片描述

  • asarray()函数
    在这里插入图片描述
  • zeros_like()与ones_like()函数
    在这里插入图片描述
  • full()函数
    在这里插入图片描述
  • 产生单位矩阵 - eye()与identity()函数
    在这里插入图片描述

4、数组元素的数据类型

在这里插入图片描述

  • ndarray数组类型是保存在dtype属性里的
    在这里插入图片描述
  • float64,双精度实数,8个字节,64位
  • float32,单精度实数,4个字节,32位
    在这里插入图片描述
  • 类型转换演示
    在这里插入图片描述
  • 当然有些时候类型转换会失败
    在这里插入图片描述

四、NumPy数组的运算

NumPy数组可以进行不用for循环进行批量数据操作,用户称之为向量化。

1、数组与数组的算术运算

  • 相同尺寸的数组进行算术运算,是逐个元素进行相应的运算。
    在这里插入图片描述

2、数组与标量的算术运算

  • 不仅数组与数组可以进行四则运算,而且数组与标量也可以进行四则运算
    在这里插入图片描述

3、数组与数组的关系运算

  • 数组与数组,不仅可以进行算术运算,还可以进行关系运算
    在这里插入图片描述

4、数组与标量的关系运算

  • 甚至,数组与标量也可以进行关系运算
    在这里插入图片描述

5、广播概述

  • 不同尺寸数组进行的运算,称之为广播(broadcasting)。

在这里插入图片描述

五、基本索引与切片

NumPy数组索引操作是个丰富的话题,有很多不同的方式去选择数组的子集或单个元素。

1、NumPy一维数组索引与切片

  • NumPy一维数组索引操作很简单,表面上看起来类似于Python的列表索引操作。
    在这里插入图片描述
  • 在NumPy里,可以对切片赋一个列表,也可以赋一个标量,而Python的列表切片(元素个数超过1个)是不能赋一个标量。
    在这里插入图片描述
  • NumPy数组与Python列表在切片上还有一个不同,NumPy数组切片是原数组的“视图”,视图上的修改会反映到原数组上。
    在这里插入图片描述
    在这里插入图片描述
  • 如果希望数组切片上的操作不影响原数组,那么利用copy方法来生成一个切片备份就可以。

在这里插入图片描述

2、NumPy二维数组索引与切片

在这里插入图片描述

  • 对于二维数组,单索引访问到的是一维数组,比如arr2d[1]访问的第二行[1, 4, 9]。
    在这里插入图片描述
  • 访问二维数组的某个元素,有两种做法
    在这里插入图片描述

六、数学函数

  • add 求和
  • subtract 求差
  • multiply 求积
  • divide 求商
  • power 求幂
  • remainder 求余
    在这里插入图片描述

七、统计函数

1、最大值与最小值函数 - amax, amin

在这里插入图片描述

2、求最大值与最小值之差函数 - ptp

在这里插入图片描述

3、统计百分位函数 - percentile

在这里插入图片描述

4、中位数函数median和平均数函数mean

在这里插入图片描述

5、加权平均函数 - average

在这里插入图片描述

6、方差函数var与标准差函数std

在这里插入图片描述

八、排序函数 - sort

在这里插入图片描述
在这里插入图片描述
假设一个团队有5名学员,成绩如下表所示。用NumPy统计他们在语文、英语和数学的平均成绩、最小成绩、最大成绩、方差和标准差。然后按照总成绩排序,得出名次,输出成绩。
在这里插入图片描述

  • 创建程序 - 统计成绩.py
    在这里插入图片描述
# -*- coding: utf-8 -*-
"""
Created on Thu Oct 22 18:01:53 2020

@author: howard

统计成绩
"""

import numpy as np

stutype = np.dtype({
    
    
    'names': ['name', 'chinese', 'math', 'english'],
    'formats': ['S32', 'i', 'i', 'i', 'i']})

students = np.array([('mike', 95, 80, 78),
                     ('alice', 87, 90, 80),
                     ('green', 93, 78, 72),
                     ('brown', 89, 95, 84),
                     ('brian', 60, 90, 89)], dtype=stutype) 

chinese = students[:]['chinese']
math = students[:]['math']
english = students[:]['english']

def show(name, subject):
    print("{} | {:^6.2f} | {:^6.1f} | {:^6.1f} | {:^6.2f} | {:^6.2f}".format(name, np.mean(subject),
          np.amax(subject), np.amin(subject), np.var(subject), np.std(subject)))
    
print('科目 | 平均分 | 最高分 | 最低分 | 方差    | 标准差')
show('语文', chinese)
show('数学', math)
show('英语', english)   
print()

print("姓名 | 语文  | 数学 | 英语 | 总分")
rankings = sorted(students, key=lambda x: x[1]+x[2]+x[3])
for ranking in rankings:
    print("{:5s}|{:^6d}|{:^6d}|{:^6d}|{:^6d}".format(ranking['name'].decode('utf-8'), ranking['chinese'], ranking['math'], ranking['english'],
          ranking['chinese'] + ranking['math'] + ranking['english']))
  • 运行程序,查看结果
    在这里插入图片描述
  • 如果按照单科排序,那么可以直接利用np.sort方法,指定order属性值即可。
    在这里插入图片描述
  • 可以看到确实按数学成绩升序排列:78、80、90、90、95
  • 如果要数学成绩降序排列,可以这样来做:
    在这里插入图片描述

九、扩展练习

1、任务:二维随机数组取绝对值

方法一、利用条件切片

在这里插入图片描述

方法二、利用np.abs()函数

在这里插入图片描述

2、任务:求解三元一次方程组

{ x + 2 y + 3 z = 14 ( 1 ) 2 x − 4 y + z = − 3 ( 2 ) 3 x + 5 y − 2 z = 7 ( 3 ) \begin{cases} x + 2y + 3z = 14 &(1)\\ 2x -4y +z = -3 &(2)\\ 3x + 5y - 2z = 7 &(3) \end{cases} x+2y+3z=142x4y+z=33x+5y2z=7(1)(2)(3)
在这里插入图片描述

# -*- coding: utf-8 -*-
"""
Created on Thu Oct 22 18:09:11 2020

@author: howard

求解三元一次方程组
"""

import numpy as np

A = np.array([[1, 2, 3],
              [2, -4, 1],
              [3, 5, -2]])
B = np.array([[14],
              [-3],
              [7]])

X = np.dot(np.linalg.inv(A), B)
print('x1 = {:.2f}\nx2 = {:.2f}\nx3 = {:.2f}'.format(X[0, 0], X[1, 0], X[2, 0]))
print()

X = np.linalg.inv(A).dot(B)
print('x1 = {:.2f}\nx2 = {:.2f}\nx3 = {:.2f}'.format(X[0, 0], X[1, 0], X[2, 0]))
print()

X = np.linalg.solve(A, B)
print('x1 = {:.2f}\nx2 = {:.2f}\nx3 = {:.2f}'.format(X[0, 0], X[1, 0], X[2, 0]))

猜你喜欢

转载自blog.csdn.net/howard2005/article/details/109216946