Numpy (Numerical Python)

  • 高性能科学计算和数据分析的基础包;
  • ndarray,多维数组(矩阵),具有矢量运算能力,快速、节省空间;
  • 矩阵运算,无需循环,可以完成类似Matlab中的矢量运算;
  • 线性代数、随机送生成;

ndarray ,N维数组对象(矩阵)

  • 所有元素必须是相同类型
  • ndim属性,维度个数
  • shape属性,各维度大小
  • dtype属性,数据类型

代码示例:

  1. import numpy
  2. # 生成指定维度的随机多维数据(两行三列)
  3. data = numpy.random.rand(2, 3)
  4. print data
  5. print type(data)
  • 执行结果:
  1. [[ 0.49458614 0.14245674 0.26883084]
  2. [ 0.87402248 0.71089966 0.29023523]]
  3. <type 'numpy.ndarray'>
  1. print '维度个数', data.ndim
  2. print '各维度大小: ', data.shape
  3. print '数据类型: ', data.dtype
  • 执行结果:
  1. 维度个数 2
  2. 各维度大小: (2L, 3L)
  3. 数据类型: float64

1、创建ndarray

numpy.array(collection),collection为序列型对象(list),嵌套序列(list of list)

  1. # list 转换为 ndarray(一维数组)
  2. l = range(10)
  3. data = numpy.array(l)
  4. print data
  5. print data.shape
  6. print data.ndim
  • 执行结果
  1. [0 1 2 3 4 5 6 7 8 9]
  2. (10L,)
  3. 1
  1. # 嵌套序列转换为ndarray
  2. l2 = [range(10), range(10)]
  3. data = numpy.array(l2)
  4. print data
  5. print data.shape
  • 执行结果
  1. [[0 1 2 3 4 5 6 7 8 9]
  2. [0 1 2 3 4 5 6 7 8 9]]
  3. (2L, 10L)

numpy.zeros,numpy.ones,numpy.empty 指定大小的全0或全1数组

  • 第一个参数是元祖,用来指定大小,如(3,4)
  • empty不是总是返回全0,有事返回的是未初始的随机值
  1. # numpy.zeros
  2. zeros_arr = numpy.zeros((3, 4))
  3.  
  4. # numpy.ones
  5. ones_arr = numpy.ones((2, 3))
  6.  
  7. # numpy.empty
  8. empty_arr = numpy.empty((3, 3))
  9.  
  10. # numpy.empty 指定数据类型
  11. empty_int_arr = numpy.empty((3, 3), int)
  12.  
  13. print zeros_arr
  14. print '-------------'
  15. print ones_arr
  16. print '-------------'
  17. print empty_arr
  18. print '-------------'
  19. print empty_int_arr
  • 执行结果:
  1. [[ 0. 0. 0. 0.]
  2. [ 0. 0. 0. 0.]
  3. [ 0. 0. 0. 0.]]
  4. -------------
  5. [[ 1. 1. 1.]
  6. [ 1. 1. 1.]]
  7. -------------
  8. [[ 2.10788133e-316 2.98795843e-316 2.16703793e-316]
  9. [ 1.55258311e-316 1.55258311e-316 2.10819471e-316]
  10. [ 2.98795843e-316 2.42334417e-316 3.32767718e-316]]
  11. -------------
  12. [[1778384910 40108033 156928]
  13. [1509950083 23330819 217856]
  14. [1392509284 0 24969340]]

numpy.arange()类似range()

  1. print numpy.arange(10)
  • 执行结果:
  1. [0 1 2 3 4 5 6 7 8 9]

ndarray数据类型

  • dtype,类型名+位数,如float64、int32
  • 转换数组类型 astype
  1. zeros_float_arr = numpy.zeros((3, 4), dtype=numpy.float64)
  2. print zeros_float_arr
  3. print zeros_float_arr.dtype
  4.  
  5. # astype转换数据类型
  6. zeros_int_arr = zeros_float_arr.astype(numpy.int32)
  7. print zeros_int_arr
  8. print zeros_int_arr.dtype
  • 执行结果:
  1. [[ 0. 0. 0. 0.]
  2. [ 0. 0. 0. 0.]
  3. [ 0. 0. 0. 0.]]
  4. float64
  5. [[0 0 0 0]
  6. [0 0 0 0]
  7. [0 0 0 0]]
  8. int32

矢量化(vectorization)

  • 矢量运算,相同大小的数组键间的运算应用在元素上
  • 矢量和标量运算,“广播”- 将标量“广播”到各个元素
  1. # 矢量与矢量运算
  2. arr = numpy.array([[1, 2, 3],
  3. [4, 5, 6]])
  4.  
  5. print "元素相乘:"
  6. print arr * arr
  7.  
  8. print "矩阵相加:"
  9. print arr + arr
  • 执行结果:
  1. 元素相乘:
  2. [[ 1 4 9]
  3. [16 25 36]]
  4. 矩阵相加:
  5. [[ 2 4 6]
  6. [ 8 10 12]]
  1. arr = numpy.array([[1, 2, 3],
  2. [4, 5, 6]])
  3. # 矢量与标量运算
  4. print 1. / arr
  5. print 2. * arr
  • 执行结果:
  1. [[ 1. 0.5 0.33333333]
  2. [ 0.25 0.2 0.16666667]]
  3. [[ 2. 4. 6.]
  4. [ 8. 10. 12.]]

索引与切片

  • 一维数组与python的列表索引功能相似
  • 多维数组的索引 (arr[1,1]等价于arr[1][1],[:]代表某个维度的数据)
  • 条件索引(布尔值多维数组,arr[condition],condition可以是多个条件组合,多个条件组合要使用&、|,而不是and、or)
  1. # 一维数组
  2. arr1 = numpy.arange(10)
  3. print arr1
  4.  
  5. print arr1[2:5]
  • 执行结果:
  1. [0 1 2 3 4 5 6 7 8 9]
  2. [2 3 4]
  1. # 多维数组
  2. arr2 = numpy.arange(12).reshape(3,4)
  3. print arr2
  4. print arr2[1]
  5. print arr2[0:2, 2:]
  6. print arr2[:, 1:3]
  • 执行结果:
  1. [[ 0 1 2 3]
  2. [ 4 5 6 7]
  3. [ 8 9 10 11]]
  4.  
  5. [4 5 6 7]
  6.  
  7. [[2 3]
  8. [6 7]]
  9.  
  10. [[ 1 2]
  11. [ 5 6]
  12. [ 9 10]]

  1. # 条件索引
  2.  
  3. # 找出 data_arr 中 2015年后的数据
  4. data_arr = numpy.random.rand(3,3)
  5. print data_arr
  6.  
  7. year_arr = numpy.array([[2000, 2001, 2000],
  8. [2005, 2002, 2009],
  9. [2001, 2003, 2010]])
  10.  
  11. is_year_after_2005 = year_arr >= 2005
  12. print is_year_after_2005, is_year_after_2005.dtype
  13.  
  14. filtered_arr = data_arr[is_year_after_2005]
  15. print filtered_arr
  • 执行结果:
  1. [[ 0.63168725 0.85543622 0.30599083]
  2. [ 0.11615184 0.51911173 0.52385353]
  3. [ 0.14844493 0.91796881 0.21024523]]
  4.  
  5. [[False False False]
  6. [ True False True]
  7. [False False True]] bool
  8.  
  9. [ 0.11615184 0.52385353 0.21024523]

上面条件索引简洁写法

  1. # 条件索引
  2.  
  3. # 找出 data_arr 中 2015年后的数据
  4. data_arr = numpy.random.rand(3,3)
  5. print data_arr
  6.  
  7. year_arr = numpy.array([[2000, 2001, 2000],
  8. [2005, 2002, 2009],
  9. [2001, 2003, 2010]])
  10.  
  11. filtered_arr = data_arr[year_arr >= 2005]
  12. print filtered_arr

执行结果:

  1. [[ 0.95234521 0.5807057 0.52735329]
  2. [ 0.47923737 0.59162051 0.45005005]
  3. [ 0.76956902 0.42958933 0.79465332]]
  4.  
  5. [ 0.47923737 0.45005005 0.79465332]

  1. # 条件索引
  2.  
  3. # 找出 data_arr 中 2015年以前的数据,并且除2余0
  4. data_arr = numpy.random.rand(3,3)
  5. print data_arr
  6.  
  7. year_arr = numpy.array([[2000, 2001, 2000],
  8. [2005, 2002, 2009],
  9. [2001, 2003, 2010]])
  10.  
  11. # 多个条件
  12. filtered_arr = data_arr[(year_arr <= 2005) & (year_arr % 2 == 0)]
  13. print filtered_arr

执行结果:

  1. [[ 0.73363831 0.82841715 0.96231068]
  2. [ 0.88736662 0.31812448 0.58970943]
  3. [ 0.30176911 0.37907437 0.13729544]]
  4.  
  5. [ 0.73363831 0.96231068 0.31812448]

维数转换

  • 转置transpose
  • 高维数组转置要指定维度编号

  1. arr = numpy.random.rand(2,3)
  2. print arr
  3. print arr.transpose()

执行结果:

  1. [[ 0.0386642 0.87739409 0.58251658]
  2. [ 0.88991982 0.73074965 0.92150766]]
  3.  
  4. [[ 0.0386642 0.88991982]
  5. [ 0.87739409 0.73074965]
  6. [ 0.58251658 0.92150766]]
  1. arr3d = numpy.random.rand(2,3,4)
  2. print arr3d
  3. print '----------------------'
  4. print arr3d.transpose((1,0,2)) # 3x2x4

执行结果:

  1. [[[ 0.58897083 0.3391822 0.33545661 0.94196946]
  2. [ 0.55366683 0.20265899 0.6147795 0.18669334]
  3. [ 0.93987911 0.43558565 0.58834912 0.99346361]]
  4.  
  5. [[ 0.84025212 0.86950502 0.69863368 0.91995894]
  6. [ 0.85805814 0.26802831 0.06903254 0.40061396]
  7. [ 0.56639909 0.23823499 0.48753265 0.54143843]]]
  8. ----------------------
  9. [[[ 0.58897083 0.3391822 0.33545661 0.94196946]
  10. [ 0.84025212 0.86950502 0.69863368 0.91995894]]
  11.  
  12. [[ 0.55366683 0.20265899 0.6147795 0.18669334]
  13. [ 0.85805814 0.26802831 0.06903254 0.40061396]]
  14.  
  15. [[ 0.93987911 0.43558565 0.58834912 0.99346361]
  16. [ 0.56639909 0.23823499 0.48753265 0.54143843]]]

说明:代码中transpose参数元组(1,0,2)可以理解为是索引组成的元组,
1对应的还是3,0对应的还是2,2对应的还是4, 通过索引的位置变换。

通用函数(ufunc)

  • 元素级运算
  • ceil,向上最接近的整数
  • floor,向下最接近的整数
  • rint,四舍五入
  • isnan,判断元素是否为NaN(Not a Number)
  • multiply,元素相乘
  • divide,元素相除
  1. arr = numpy.random.randn(2,3)
  2.  
  3. print arr
  4. print numpy.ceil(arr)
  5. print numpy.floor(arr)
  6. print numpy.rint(arr)
  7. print numpy.isnan(arr)
  • 执行结果:
  1. [[-1.58805196 -0.81383734 -0.0310861 ]
  2. [-1.19410445 0.77250857 0.66694595]]
  3.  
  4. [[-1. -0. -0.]
  5. [-1. 1. 1.]]
  6.  
  7. [[-2. -1. -1.]
  8. [-2. 0. 0.]]
  9.  
  10. [[-2. -1. 0.]
  11. [-1. 1. 1.]]
  12.  
  13. [[False False False]
  14. [False False False]]

numpy.where

  • 矢量版本的三元表达式 x if condition else y
  • numpy.where(condition,x,y)
  1. arr = numpy.random.randn(3,4)
  2. print arr
  3.  
  4. numpy.where(arr > 0, 1, -1)
  • 执行结果:
  1. [[-0.06283048 0.90505846 -1.53498969 1.44885017]
  2. [ 0.19133703 -1.63035289 1.40158507 0.05605055]
  3. [ 1.58101557 1.31273601 -0.17298785 -1.95508151]]
  4.  
  5. array([[-1, 1, -1, 1],
  6. [ 1, -1, 1, 1],
  7. [ 1, 1, -1, -1]])

常用统计方法

  • numpy.mean 数组平均值
  • numpy.sum 数组求和
  • numpy.max  数组最大值
  • numpy.min  数组最小值
  • numpy.std  数组平方差
  • numpy.var  数组方差
  • numpy.argmax  最大元素的下标输出
  • numpy.argmin   最小元素的下标输出
  • numpy.cumsum  累加
  • numpy.cumprod  累乘
  • numpy.all  全部满足条件
  • numpy.any  至少有一个元素满足条件
  • numpy.unique  找到唯一值并返回排序结果
  • numpy.loadtxt

注意:多维数组可以指定统计的维度,否则默认是全部维度上做统计。

  1. arr = numpy.arange(10).reshape(5,2)
  2. print arr
  3. print numpy.sum(arr)
  4. print numpy.sum(arr, axis=0)
  5. print numpy.sum(arr, axis=1)

执行结果:

  1. [[0 1]
  2. [2 3]
  3. [4 5]
  4. [6 7]
  5. [8 9]]
  6.  
  7. 45
  8.  
  9. [20 25]
  10.  
  11. [ 1 5 9 13 17]
  1. arr = numpy.random.randn(2,3)
  2. print arr
  3. print numpy.any(arr > 0)
  4. print numpy.all(arr > 0)
  • 执行结果:
  1. [[-0.89387663 0.69226989 -1.71408496]
  2. [-0.25904772 -0.88833077 -1.141312 ]]
  3.  
  4. True
  5.  
  6. False
  1. arr = numpy.array([[1, 2, 1], [2, 3, 4]])
  2. print arr
  3. print numpy.unique(arr)

执行结果:

  1. [[1 2 1]
  2. [2 3 4]]
  3.  
  4. [1 2 3 4]
  1. # loadtxt, 明确指定每列数据的类型
  2. filename = './shhnwangjian.csv'
  3. data_array = numpy.loadtxt(filename, # 文件名
  4. delimiter=',', # 分隔符
  5. skiprows=1, # 跳过第一行
  6. dtype={'names':('cycle', 'type', 'matchup'),
  7. 'formats':('i4', 'S15', 'S50')}, # 数据类型
  8. usecols=(0,2,3)) # 指定读取的列索引号
  9.  
  10. print data_array, data_array.shape # 读取的结果是一维的数组,每个元素是一个元组

学习参考

快速入门numpy、scipy  https://docs.scipy.org/doc/numpy-dev/user/quickstart.html

numpy教程  http://cs231n.github.io/python-numpy-tutorial/

numpy、SciPy 介绍 https://engineering.ucsb.edu/~shell/che210d/numpy.pdf

13个numpy、SciPy教程 http://www.erzama.com/scipy-numpy-tutorials-w-12023/

《Python数据分析基础教程:NumPy学习指南》

python数据分析Numpy(二)的更多相关文章

  1. Python数据分析-Numpy数值计算

    Numpy介绍: NumPy是高性能科学计算和数据分析的基础包.它是pandas等其他各种工具的基础. NumPy的主要功能: 1)ndarray,一个多维数组结构,高效且节省空间 2)无需循环对整组 ...

  2. Python 数据分析(二 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识

    Python 数据分析(二) 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识 第1节 groupby 技术 第2节 数据聚合 第3节 分组级运算和转换 第4 ...

  3. Python数据分析——numpy基础简介

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:基因学苑 NumPy(Numerical Python的简称)是高性 ...

  4. Python数据分析Numpy库方法简介(二)

    数据分析图片保存:vg 1.保存图片:plt.savefig(path) 2.图片格式:jpg,png,svg(建议使用,不失真) 3.数据存储格式: excle,csv csv介绍 csv就是用逗号 ...

  5. Python数据分析numpy库

    1.简介 Numpy库是进行数据分析的基础库,panda库就是基于Numpy库的,在计算多维数组与大型数组方面使用最广,还提供多个函数操作起来效率也高 2.Numpy库的安装 linux(Ubuntu ...

  6. python 数据分析----numpy

    NumPy是高性能科学计算和数据分析的基础包.它是pandas等其他各种工具的基础. NumPy的主要功能: ndarray,一个多维数组结构,高效且节省空间 无需循环对整组数据进行快速运算的数学函数 ...

  7. python数据分析 Numpy基础 数组和矢量计算

    NumPy(Numerical Python的简称)是Python数值计算最重要的基础包.大多数提供科学计算的包都是用NumPy的数组作为构建基础. NumPy的部分功能如下: ndarray,一个具 ...

  8. Python数据分析 | Numpy与1维数组操作

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/33 本文地址:http://www.showmeai.tech/article-det ...

  9. [读书笔记] Python数据分析 (二) 引言

      1. 数据分析的任务:数据读写,数据准备(清洗,修整,规范化,重塑,切片切块,变形),转换,建模计算,呈现(模型/数据) 2. 数据集: bit.ly的1.usa.gov数据:URL缩短服务bit ...

随机推荐

  1. 微信小程序 Echarts 异步数据更新

    微信小程序 Echarts 异步数据更新的练习,被坑了很多次,特作记录. 作者:罗兵 地址:https://www.cnblogs.com/hhh5460/p/9989805.html 0.效果图   ...

  2. Scala学习(一)--Scala基础学习

    Scala基础学习 摘要: 在篇主要内容:如何把Scala当做工业级的便携计算器使用,如何用Scala处理数字以及其他算术操作.在这个过程中,我们将介绍一系列重要的Scala概念和惯用法.同时你还将学 ...

  3. 基于Boost库的HTTP Post函数

    两个函数的区别: 提交表单数据和提交文本数据 表单数据: request_stream << "Content-Type: application/x-www-form-urle ...

  4. 学习JAVA第一章的心得

    我抱着万分期待的心情开始了我第一天的JAVA学习课程,其实在第一开始的时候我对计算机行业便有很高地兴趣了.这主要归功于我真的从很小开始就就接触了电脑.进入学校以来,我就很期待老师会怎样教我们,会怎样带 ...

  5. Html_div圆角

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. cocos2d-x学习之路(二)——分析AppDelegate和HelloWorldScene文件

    这里我们来看一下cocos自动给我们生成的工程里有些什么东西,并且分析一下这些代码的用途,来为我们以后编写cocos程序铺下基础. 这里我建议看我这份随笔的看官先看看cocos官网的快速入门手册,不然 ...

  7. Linux_01

    要安装centos系统,就必须得有centos系统软件安装程序,可以通过浏览器访问centos官网http://www.centos.org,然后找到Downloads  - >  mirror ...

  8. 微软职位内部推荐-Software Engineer

    微软近期Open的职位: Job Title: Software Engineer Work Location: Suzhou, China This is a once in a lifetime ...

  9. 微软职位内部推荐-Senior Program Manager

    微软近期Open的职位: Title: Senior Program Manager – Bing Multimedia Relevance Group: Search Technology Cent ...

  10. Python中的字典详解

    https://www.cnblogs.com/yjd_hycf_space/p/6880026.html