声明:本文大量参考https://www.dataquest.io/mission/6/getting-started-with-numpy(建议阅读原文)

 

读取文件

有一个名为world_alcohol.csv的文件,文件格式如下

Year,WHO region,Country,Beverage Types,Display Value

1986,Western Pacific,Viet Nam,Wine,0

1986,Americas,Uruguay,Other,0.5

1985,Africa,Cte d'Ivoire,Wine,1.62

文件内容的含义:(这是一份全球的饮料消耗记录表,第一列的意思是记录的年份,第二列指的是饮料的出产地,第三列指的是饮料的消耗地,第四列指的是饮料的类型,第五列指的是饮料的每人平均消耗量)

 

现在使用numpy的genfromtxt()函数来读取该文件,delimiter参数是用来指定每一行用来分隔数据的分隔符

  1. import numpy
  2.  
  3. world_alcohol = numpy.genfromtxt('world_alcohol.csv', delimiter=',')
  4.  
  5. print(world_alcohol)

此时读取到的内容如下:

[[             nan              nan              nan              nan

               nan]

[  1.98600000e+03              nan              nan              nan

    0.00000000e+00]

[  1.98600000e+03              nan              nan              nan

    5.00000000e-01]

..., 

[  1.98600000e+03              nan              nan              nan

    2.54000000e+00]

[  1.98700000e+03              nan              nan              nan

    0.00000000e+00]

[  1.98600000e+03              nan              nan              nan

    5.15000000e+00]]

 

这是因为numpy在读取元素时,默认是按照float格式来读取的,对于不能转换为float类型的数据会读取为nan(not a number),对于留空的数据则显示为na(not available),为了正确的读取数据,可以通过增加参数:

  1. dtype参数用来指定读取数据的格式,这里的U75表示将每一个数据都读取为75个byte的unicode数据格式
  2. skip_header参数用来跳过文件的第一行
  3. delimiter参数用来指定每行数据的分隔符
  1. import numpy
  2.  
  3. world_alcohol = numpy.genfromtxt('world_alcohol.csv', dtype='U75', skip_header=True, delimiter=',')
  4.  
  5. print(world_alcohol)

 

数组

可以通过array()函数来创建一个数组,在这里向量指的是变量只有一个列表,矩阵指的是具有多个列表的列表

创建一个向量:vector = numpy.array([10, 20, 30])

创建一个矩阵:matrix = numpy.array([[5,10,15],[20,25,30],[35,40,45]])

 

数组的属性:

  1. shape属性描述了该数组的结构
  2. print(vector.shape)

    输出结果: (3,) 这是一个元组,表示vector变量是一个只有一行的向量,具有3个元素

    print(matrix.shape)

    输出结果: (3,3)表示matrix变量是一个3 × 3的矩阵,具有3行3列共9个元素

  3. dtype属性描述了元素的数据类型
  4. print(vector.shape)

    输出结果: int64 

数据类型大致有以下几种:

  1. bool -- 布尔类型,True或者False
  2. int -- 整型,分为int16, int32, int64,后面的数字表明数值的长度
  3. float -- 浮点型,分为float16, float32, float64,后面的数字表明数值的长度
  4. string -- 字符串类型,分为string或者unicode,它们的差异在于存储字符的方式

 

索引和分片

谨记一点:数组的索引是从0开始的

  1. matrix = numpy.array([
  2.  
  3. [5,10,15],
  4.  
  5. [20,25,30],
  6.  
  7. [35,40,45]
  8.  
  9. ])
  10.  
  11. print(matrix[1][1]) # 两种方式都可以索引数据,输出结果都是25,注意这里索引的是第二行第二个
  12.  
  13. print(matrix[1,1])

可以类似于使用切片来操作数据(将切片操作符 : 理解为‘全部’)

  1. print(matrix[:,0]) # 输出全部行,第一列的数据 [ 5 20 35]
  2.  
  3. print(matrix[0,:]) # 输出第一行,全部列的数据 [ 5 10 15]
  4.  
  5. print(matrix[:,0:2]) # 输出全部行,前2列的数据[ [5, 10], [20, 25], [35, 40] ]
  6.  
  7. print(matrix[1:3,:]) # 输出第2和第3行的全部列的数据 [ [20, 25, 30], [35, 40, 45] ]
  8.  
  9. print(matrix[1:3,1]) # 输出第2,3行的第1列数据 [ [10], [25] ]

 

数组比较

将数组与一个值相比较的时候,实际上是把数组内的每个值都与该值比较,然后返回一个布尔值列表

  1. vector = numpy.array([5, 10, 15, 20])
  2.  
  3. vector == 10
  4.  
  5. 返回的是:[False, True, False, False]

对于矩阵也如此

  1. matrix = numpy.array([
  2.  
  3. [5, 10, 15],
  4.  
  5. [20, 25, 30],
  6.  
  7. [35, 40, 45]
  8.  
  9. ])
  10.  
  11. matrix == 25
  12.  
  13. 结果如下:[
  14.  
  15. [False, False, False],
  16.  
  17. [False, True, False],
  18.  
  19. [False, False, False]
  20.  
  21. ]

数组比较中还可以使用多条件

  1. vector = numpy.array([5, 10, 15, 20])
  2.  
  3. equal_to_ten_and_five = (vector == 10) & (vector == 5)
  4.  
  5. 输出:[False, False, False, False]
  6.  
  7. equal_to_ten_or_five = (vector == 10) | (vector == 5)
  8.  
  9. 输出:[True, True, False, False]

 

数组比较的最大用处是

一、用来选择数组或矩阵中的元素

  1. matrix = numpy.array([
  2.  
  3. [5, 10, 15],
  4.  
  5. [20, 25, 30],
  6.  
  7. [35, 40, 45]
  8.  
  9. ])
  10.  
  11. second_column_25 = (matrix[:,1] == 25)
  12.  
  13. print(matrix[second_column_25, :])
  14.  
  15. 作用:提取出matrix中第二列中等于25的所有行,结果为[20, 25, 30]

二、替换元素

  1. vector = numpy.array([5, 10, 15, 20])
  2.  
  3. equal_to_ten_or_five = (vector == 10) | (vector == 5)
  4.  
  5. vector[equal_to_ten_or_five] = 50
  6.  
  7. print(vector)
  8.  
  9. 输出:[50, 50, 15, 20]

原理如下:

 

常用于替换空元素

譬如将world_alcohol中的第五列中的留空的数据都替换为字符串0:

  1. is_value_empty = world_alcohol[:, 4] == ' '
  2.  
  3. world_alcohol[is_value_empty, 4] = '0'

 

 

数据类型转换

通过使用astype()函数来转换一个数组的数据类型

  1. vector = numpy.array(["1", "2", "3"])
  2.  
  3. vector = vector.astype(float)
  4.  
  5. print(vector)
  6.  
  7. 结果:[1.0, 2.0, 3.0]

 

 

简单的运算

参考numpy的手册:http://docs.scipy.org/doc/numpy-1.10.1/index.html

挑出几个重要的运算函数:

  1. l sum() -- 计算一个向量中的全部元素的总和,或者是一个矩阵中的一个维度的总和
  2. l mean() -- 同上,计算的是平均值
  3. l max() -- 同上,计算的是最大值
  1. vector = numpy.array([5, 10, 15, 20])
  2. vector.sum()
  3.  
  4. 结果为:50
  5.  
  6. matrix = numpy.array([
  7.  
  8. [5, 10, 15],
  9.  
  10. [20, 25, 30],
  11.  
  12. [35, 40, 45]
  13.  
  14. ])
  15.  
  16. matrix.sum(axis=1)
  17.  
  18. 结果:[30, 75, 120]
  19.  
  20. 对于矩阵来说,需要指定axis参数,该参数等于1时表示计算的是每行,等于0时表示计算的是每列的总和

练习

使用world_alcohol.csv文件,计算在1986年里每个国家的饮料消耗量

  1. import numpy
  2.  
  3. world_alcohol = numpy.genfromtxt('world_alcohol.csv', dtype='U75', skip_header=True, delimiter=',')
  4.  
  5. totals = {}
  6.  
  7. year = world_alcohol[world_alcohol[:, 0] == '1989', :] # 选择1989年的数据集
  8.  
  9. countries = set(world_alcohol[:,2]) # 选择全部国家
  10.  
  11. for each in countries: # 分别计算每个国家
  12.  
  13. consumption = year[year[:,2] == each, :]
  14.  
  15. consumption[consumption[:, 4] == '',4] = '0'
  16.  
  17. temp = consumption[:,4].astype(float) # 将留空的数据转变为浮点数0参与运算
  18.  
  19. country_consumption = temp.sum()
  20.  
  21. totals[each] = country_consumption

 

总结

使用numpy的比直接对一个列表集合的运算更加方便,主要优于以下几点:

  1. 更容易对数据进行计算
  2. 可以快速地进行数据索引和分片
  3. 可以快速地转换数据类型

然而,numpy有一些不足之处:

  1. 在同一个数据集中的数据必须具有相同的数据类型,在处理多数据集时会变得很困难
  2. 行和列都需要使用数字来索引,而不能使用别名,这样容易造成混淆

 

而Pandas解决了Numpy的几点不足

numpy简单入门的更多相关文章

  1. NumPy简单入门教程

    # NumPy简单入门教程 NumPy是Python中的一个运算速度非常快的一个数学库,它非常重视数组.它允许你在Python中进行向量和矩阵计算,并且由于许多底层函数实际上是用C编写的,因此你可以体 ...

  2. 初学Python之爬虫的简单入门

    初学Python之爬虫的简单入门 一.什么是爬虫? 1.简单介绍爬虫   爬虫的全称为网络爬虫,简称爬虫,别名有网络机器人,网络蜘蛛等等. 网络爬虫是一种自动获取网页内容的程序,为搜索引擎提供了重要的 ...

  3. 用IntelliJ IDEA创建Gradle项目简单入门

    Gradle和Maven一样,是Java用得最多的构建工具之一,在Maven之前,解决jar包引用的问题真是令人抓狂,有了Maven后日子就好过起来了,而现在又有了Gradle,Maven有的功能它都 ...

  4. [原创]MYSQL的简单入门

    MYSQL简单入门: 查询库名称:show databases; information_schema mysql test 2:创建库 create database 库名 DEFAULT CHAR ...

  5. Okio 1.9简单入门

    Okio 1.9简单入门 Okio库是由square公司开发的,补充了java.io和java.nio的不足,更加方便,快速的访问.存储和处理你的数据.而OkHttp的底层也使用该库作为支持. 该库极 ...

  6. emacs最简单入门,只要10分钟

    macs最简单入门,只要10分钟  windwiny @2013    无聊的时候又看到鼓吹emacs的文章,以前也有几次想尝试,结果都是玩不到10分钟就退出删除了. 这次硬着头皮,打开几篇文章都看完 ...

  7. 【java开发系列】—— spring简单入门示例

    1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...

  8. Docker 简单入门

    Docker 简单入门 http://blog.csdn.net/samxx8/article/details/38946737

  9. Springmvc整合tiles框架简单入门示例(maven)

    Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...

随机推荐

  1. ASP.NET 之 检测到在集成的托管管道模式下不适用的ASP.NET设置

    将ASP.NET程序从IIS6移植到IIS7后,调试运行可能提示以下错误: HTTP 错误 500.23 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP. ...

  2. shell判断一个变量是否为空

    判断一个变量是否为空 . 1. 变量通过" "引号引起来 如下所示:,可以得到结果为 IS NULL. #!/bin/sh para1= if [ ! -n "$para ...

  3. jQuery Validate 插件[表单验证 属性介绍]

    详细介绍一下Validate插件 $("#form的Id").validate({ }) 属性 规则 描述 required:true 必须输入的字段 required: &quo ...

  4. 【杨氏矩阵+勾长公式】POJ 2279 Mr. Young's Picture Permutations

    Description Mr. Young wishes to take a picture of his class. The students will stand in rows with ea ...

  5. mysql 5.7 root password 过期

    重新修改root密码 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass'); ALTER USER 'root'@localhost' P ...

  6. show/hide

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. As,is含义?using 语句

    Is:检查对象是否与给定的类型兼容.例如,下面的代码可以确定MyObject类型的一个实例,或者对象是否从MyObject派生的一个类型:        if(obj is MyObject){}   ...

  8. 做一个聪明的.net程序员

    最近看了传智播客(http://net.itcast.cn/)的.net培训视频,感受颇深,忍不住要把感受写下来跟网友分享一下. 我从接触.net到现在已经至少过去了三五个年头,用.net也已经做了若 ...

  9. 几个简单的Makefile

    http://www.blogjava.net/canvas/articles/quick_makefile.html 几个简单适合小程序的Makefile,可直接拷贝使用,自己mark一下,这样长时 ...

  10. php对UTF8字体串进行单字分割返回数组

    在网上查了很多字符串分割方法,都无法正确对UTF8字符串进行正确分割返回单个字符的数组.经过对FTU8编码的分析写出了下面的方法对UTF8进行分割.本人测试可用.本方法只支持UTF8编码的,其它编码转 ...