NumPy 数组结构和 Python 列表 list 对比:

标准的 Python 中,用列表 list 保存数组的数值。由于列表中的元素可以是任意的对象,所以列表中list保存的是对象的指针。虽然在 Python 编程中隐去了指针的概念,但是数组有指针,Python 的列表 list 其实就是数组。这样如果我要保存一个简单的数组 [0,1,2],就需要有 3 个指针和 3 个整数的对象,这样对于 Python 来说是非常不经济的,浪费了内存和计算时间。

列表 list 的元素在系统内存中是分散存储的,而 NumPy 数组存储在一个均匀连续的内存块中。这样数组计算遍历所有的元素,不像列表 list 还需要对内存地址进行查找,从而节省了计算资源。另外在内存访问模式中,缓存会直接把字节块从 RAM 加载到CPU 寄存器中。因为数据连续的存储在内存中,NumPy 直接利用现代 CPU 的矢量化指令计算,加载寄存器中的多个连续浮点数。另外 NumPy 中的矩阵计算可以采用多线程的方式,充分利用多核 CPU 计算资源,大大提升了计算效率。

当然除了使用 NumPy 外,你还需要一些技巧来提升内存和提高计算资源的利用率。一个重要的规则就是:避免采用隐式拷贝,而是采用就地操作的方式。举个例子,如果我想让一个数值 x 是原来的两倍,可以直接写成 x*=2,而不要写成 y=x*2。

ndarray对象:

创建数组:

import numpy as np

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

b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

b[1,1]=10

print(a.shape)

print(b.shape)

print(a.dtype)

print(b)

# 运行结果:

(3,)

(3, 3)

int32

[[ 1 2 3]

[ 4 10 6]

[ 7 8 9]]

结构数组:

import numpy as np

persontype = np.dtype({

'names':['name', 'age', 'chinese', 'math', 'english'],

'formats':['S32','i', 'i', 'i', 'f']})

peoples = np.array([("ZhangFei",32,75,100, 90),("GuanYu",24,85,96,88.5),

("ZhaoYun",28,85,92,96.5),("HuangZhong",29,65,85,100)],

dtype=persontype)

ages = peoples['age']

chineses = peoples['chinese']

maths = peoples['math']

englishs = peoples['english']

print(np.mean(ages))

print(np.mean(chineses))

print(np.mean(maths))

print(np.mean(englishs))

# 运行结果

28.25

77.5

93.25

93.75

答疑 :定义结构数组中的 S32 代表什么意思?

这里实际上用的是 numpy 中的字符编码来表示数据类型的定义,比如 i 代表整数,f 代表单精度浮点数,S 代表字符串,S32 代表的是 32 个字符的字符串。

# 如果数据中使用了中文,可以把类型设置为 U32,比如:

import numpy as np

persontype = np.dtype({

'names':['name', 'age', 'chinese', 'math', 'english'],

'formats':['U32','i', 'i', 'i', 'f']})

peoples = np.array([(" 张飞 ",32,75,100, 90),(" 关羽 ",24,85,96,88.5), (" 赵云 ",28,85,92,96.5),(" 黄忠 ",29,65,85,100)], dtype=persontype)

ufunc运算:

连续数组的创建:

x1 = np.arange(1,11,2) # 初始值、终值、步长

x2 = np.linspace(1,9,5) # 初始值、终值、元素个数

算数运算:

x1 = np.arange(1,11,2)

x2 = np.linspace(1,9,5)

print(np.add(x1, x2)) # 加

print(np.subtract(x1, x2)) # 减

print(np.multiply(x1, x2)) # 乘

print(np.divide(x1, x2)) # 除

print(np.power(x1, x2)) # 幂

print(np.remainder(x1, x2)) # 取余

# 运行结果:

[ 2. 6. 10. 14. 18.]

[0. 0. 0. 0. 0.]

[ 1. 9. 25. 49. 81.]

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

[1.00000000e+00 2.70000000e+01 3.12500000e+03 8.23543000e+05

3.87420489e+08]

[0. 0. 0. 0. 0.]

统计函数:

import numpy as np

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

print(np.min(a)) # 全部元素的最小值

print(np.min(a,0)) # 竖轴方向的最小值

print(np.min(a,1)) # 横轴方向的最小值

print(np.max(a))

print(np.max(a,0))

print(np.max(a,1))

# 运行结果:

1

[1 2 3]

[1 4 7]

9

[7 8 9]

[3 6 9]

数组中最大值与最小值的差:

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

print(np.ptp(a)) # 全部元素最大值和最小值的差

print(np.ptp(a,0)) # 竖轴方向最大值和最小值的差

print(np.ptp(a,1)) # 横轴方向最大值和最小值的差

# 运行结果:

8

[6 6 6]

[2 2 2]

统计数组的百分位数 percentile()

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

print(np.percentile(a, 50)) # 所有元素中第50%位元素

print(np.percentile(a, 50, axis=0)) # 竖轴方向第50%位元素

print(np.percentile(a, 50, axis=1)) # 横轴方向第50%位元素

# 输出结果:

5.0

[4. 5. 6.]

[2. 5. 8.]

统计数组中的加权平均值 average()

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

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

print(np.average(a))

print(np.average(a,weights=wts))

# 输出结果:

2.5

3.0

加权平均的意思就是每个元素可以设置个权重,默认情况下每个元素的权重是相同的,所以 np.average(a)=(1+2+3+4)/4=2.5,

你也可以指定权重数组 wts=[1,2,3,4],这样加权平均 np.average(a,weights=wts)=(1*1+2*2+3*3+4*4)/(1+2+3+4)=3.0

统计数组中的标准差 std()、方差 var()

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

print(np.std(a))

print(np.var(a))

# 输出结果:

1.118033988749895

1.25

方差的计算是指每个数值与平均值之差的平方求和的平均值,标准差是方差的算术平方根。在数学意义上,代表的是一组数据离平均值的分散程度。

NumPy 排序

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

print(np.sort(a)) # 默认横轴方向升序

print(np.sort(a, axis=None)) # 降维+升序

print(np.sort(a, axis=0)) # 竖轴方向升序

print(np.sort(a, axis=1)) # 横轴方向升序

# 运行结果:

[[2 3 4]

[1 2 4]]

[1 2 2 3 4 4]

[[2 3 1]

[4 4 2]]

[[2 3 4]

[1 2 4]]

sort(a, axis=-1, kind=‘quicksort’, order=None),默认情况下使用的是快速排序;在 kind 里,可以指定quicksort、mergesort、heapsort

分别表示快速排序、合并排序、堆排序。同样 axis 默认是 -1,即沿着数组的最后一个轴进行排序,也可以取不同的 axis 轴,或者 axis=None

代表采用扁平化的方式作为一个向量进行排序。另外 order 字段,对于结构化的数组可以指定按照某个字段进行排序。

练习题:

假设一个团队里有 5 名学员,成绩如下表所示。你可以用 NumPy 统计下这些人在语文、英语、数学中的平均成绩、最小成绩、最大成绩、方差、标准差。然后把这些人的总成绩排序,得出名次进行成绩输出。

persontype = np.dtype({

'names':['name', 'chinese','english','math' ],

'formats':['S32', 'i', 'i', 'i']})

peoples = np.array([("ZhangFei",66,65,30),("GuanYu",95,85,98),

("ZhaoYun",93,92,96),("HuangZhong",90,88,77),

("DianWei",80,90,90)],dtype=persontype)

name = peoples['name']

chinese = peoples['chinese']

english = peoples['english']

math = peoples['math']

#定义函数用于显示每一排的内容

def show(name,cj):

print('{} | {} | {} | {} | {} | {} '

.format(name,np.mean(cj),np.min(cj),np.max(cj),np.var(cj),np.std(cj)))

print("科目 | 平均成绩 | 最小成绩 | 最大成绩 | 方差 | 标准差")

show("语文", chinese)

show("英语", english)

show("数学", math)

print("排名:")

ranking = sorted(peoples,key=lambda x:x[1]+x[2]+x[3])

print(ranking) # 默认升序

python科学计算的例子_Python科学计算:NumPy相关推荐

  1. python科学计算教程视频_Python科学计算与图形渲染库视频教程

    IT猿课(www.ityuanke.com) [it猿课ityuanke.com]Python科学计算与图形渲染库视频教程 「课程学习目录」 第1章:NumPy基础知识 1.NumPy简介 2.搭建N ...

  2. python中符号计算输出数学_Python科学计算与数据处理—符号运算库.doc

    Python 科学计算与数据处理 - 符号运算库 符号运算库目录从示例开始欧拉恒等式球体体积数学表达 式符号数值运算符和函数符号运算表达式转换和简化方程目录微分 方程积分其他函数符号运算库. 它的目标 ...

  3. python中符号计算三维可视化_Python科学计算三维可视化章节答案

    科学可视细胞衰老和死亡不止发生在生物个体衰老时. 参考答案如下 计算节答糖尿病患者需要紧急救治的情况化章糖尿病患者每日食物的组成中,碳水化合物应占多少? 科学可视糖尿病患者饮食中应注意补充下列微量元素 ...

  4. python科学计算最佳实践_Python科学计算最佳实践:SciPy指南

    领取成功 您已领取成功! 您可以进入Android/iOS/Kindle平台的多看阅读客户端,刷新个人中心的已购列表,即可下载图书,享受精品阅读时光啦! - | 回复不要太快哦~ 回复内容不能为空哦 ...

  5. python中符号计算三维可视化_Python科学计算三维可视化_答案mooc

    马格德堡半球实验是关于真空是否存在的实验.() 马来西亚历史上的第一个封建王国称为: 马林巴传入拉丁美洲大约是在什么时候? 马林科夫准备把苏联发展重点放在农业上. 马步是模仿蒙古人()的动作 马林诺夫 ...

  6. python怎么来算面积_Python实现计算长方形面积(带参数函数demo)

    Python实现计算长方形面积(带参数函数demo) 如下所示: # 计算面积函数 def area(width, height): return width * height def print_w ...

  7. python时间差转换成天数_Python实现计算两个时间之间相差天数的方法

    本文实例讲述了Python实现计算两个时间之间相差天数的方法.分享给大家供大家参考,具体如下: #-*- encoding:UTF-8 -*- from datetime import date im ...

  8. python判断正负的函数_Python |在计算操作的函数内将负数转换为正数?

    我一直在寻找将负数转换为正数,我发现了一些东西,但没有成功.. 这是一个来自在线Python页面的练习,我正在学习Python. 我希望你明白这一点. 这是去洛杉矶旅行,我用功能计算钱,但现在有一个问 ...

  9. python获取对象的大小_Python实现计算对象的内存大小示例

    本文实例讲述了Python实现计算对象的内存大小.分享给大家供大家参考,具体如下: 一般的sys.getsizeof()显示不了复杂的字典. 查看类中的内容: def dump(obj): for a ...

  10. python圆周率后100位_Python实现计算圆周率π的值到任意位的方法示例

    这篇文章主要介绍了Python实现计算圆周率π的值到任意位的方法,简单分析了圆周率的计算原理,并结合实例形式分析了Python计算圆周率的相关操作技巧,需要的朋友可以参考下 本文实例讲述了Python ...

最新文章

  1. Open3DGen:从RGB-D图像重建纹理3D模型的开源软件
  2. 创建支持nginx服务的docker镜像
  3. Linux 下 MediaWiki 的安装使用
  4. gateway sentinel 熔断 不起作用_《一起学sentinel》一
  5. 5个须警惕的数据库设计错误
  6. 官网下载mysql实例数据库
  7. Titanium 列表显示TableView
  8. 全面讲解OpenStack技术知识
  9. linux centos7.9中安装docker的3种方式-图解
  10. typedef struct和struct定义结构体的区别
  11. MySql常用函数大全(详细)
  12. pwm 正弦波_谈谈逆变器输出的方波与正弦波
  13. 二元二次方程例题_二元二次方程组 解法 例题
  14. AWS——API Gateway
  15. 微信小程序扫描程序码携带参数
  16. IIS HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
  17. KubeCon + CloudNativeCon + Open Source Summit 2019大会上海开幕看点不断!
  18. mysql=mariadb
  19. 在windows cmd中正确使用cd命令切换文件目录
  20. 【转载】新韭菜日记22----20190304股市学习--帖子是转载的,持续学习

热门文章

  1. 基金投资入门1:基金基础知识介绍
  2. 百度世界2012大会:百度云“七种武器”详解
  3. arm开发板与PC通讯及访问外网
  4. 用html做祝福语朋友,祝福朋友工作顺利的祝福语
  5. 01_配置yum源-银河麒麟V10(Kylin Linux Advanced Server V10 (Tercel))操作系统
  6. 计算机学院教学质量改进的制度,计算机科学与技术学院教学管理文件规章制度汇编.doc...
  7. 链脉企业文化篇之“链脉爱的早会”
  8. 手把手教您:iOS 6.1~6.12 完美越狱教程
  9. F.dropout()与nn.dropout()
  10. Facial Expression Recognition