Numpy (Numerical Python)

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

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

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

代码示例:

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

1、创建ndarray

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

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

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

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

numpy.arange()类似range()

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

ndarray数据类型

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

矢量化(vectorization)

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

索引与切片

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

# 条件索引

# 找出 data_arr 中 2015年后的数据
data_arr = numpy.random.rand(3,3)
print data_arr year_arr = numpy.array([[2000, 2001, 2000],
[2005, 2002, 2009],
[2001, 2003, 2010]]) is_year_after_2005 = year_arr >= 2005
print is_year_after_2005, is_year_after_2005.dtype filtered_arr = data_arr[is_year_after_2005]
print filtered_arr
  • 执行结果:
[[ 0.63168725  0.85543622  0.30599083]
[ 0.11615184 0.51911173 0.52385353]
[ 0.14844493 0.91796881 0.21024523]] [[False False False]
[ True False True]
[False False True]] bool [ 0.11615184 0.52385353 0.21024523]

上面条件索引简洁写法

# 条件索引

# 找出 data_arr 中 2015年后的数据
data_arr = numpy.random.rand(3,3)
print data_arr year_arr = numpy.array([[2000, 2001, 2000],
[2005, 2002, 2009],
[2001, 2003, 2010]]) filtered_arr = data_arr[year_arr >= 2005]
print filtered_arr

执行结果:

[[ 0.95234521  0.5807057   0.52735329]
[ 0.47923737 0.59162051 0.45005005]
[ 0.76956902 0.42958933 0.79465332]] [ 0.47923737 0.45005005 0.79465332]

# 条件索引

# 找出 data_arr 中 2015年以前的数据,并且除2余0
data_arr = numpy.random.rand(3,3)
print data_arr year_arr = numpy.array([[2000, 2001, 2000],
[2005, 2002, 2009],
[2001, 2003, 2010]]) # 多个条件
filtered_arr = data_arr[(year_arr <= 2005) & (year_arr % 2 == 0)]
print filtered_arr

执行结果:

[[ 0.73363831  0.82841715  0.96231068]
[ 0.88736662 0.31812448 0.58970943]
[ 0.30176911 0.37907437 0.13729544]] [ 0.73363831 0.96231068 0.31812448]

维数转换

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

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

执行结果:

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

执行结果:

[[[ 0.58897083  0.3391822   0.33545661  0.94196946]
[ 0.55366683 0.20265899 0.6147795 0.18669334]
[ 0.93987911 0.43558565 0.58834912 0.99346361]] [[ 0.84025212 0.86950502 0.69863368 0.91995894]
[ 0.85805814 0.26802831 0.06903254 0.40061396]
[ 0.56639909 0.23823499 0.48753265 0.54143843]]]
----------------------
[[[ 0.58897083 0.3391822 0.33545661 0.94196946]
[ 0.84025212 0.86950502 0.69863368 0.91995894]] [[ 0.55366683 0.20265899 0.6147795 0.18669334]
[ 0.85805814 0.26802831 0.06903254 0.40061396]] [[ 0.93987911 0.43558565 0.58834912 0.99346361]
[ 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,元素相除
arr = numpy.random.randn(2,3)

print arr
print numpy.ceil(arr)
print numpy.floor(arr)
print numpy.rint(arr)
print numpy.isnan(arr)
  • 执行结果:
[[-1.58805196 -0.81383734 -0.0310861 ]
[-1.19410445 0.77250857 0.66694595]] [[-1. -0. -0.]
[-1. 1. 1.]] [[-2. -1. -1.]
[-2. 0. 0.]] [[-2. -1. 0.]
[-1. 1. 1.]] [[False False False]
[False False False]]

numpy.where

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

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

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

执行结果:

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

执行结果:

[[1 2 1]
[2 3 4]] [1 2 3 4]
# loadtxt, 明确指定每列数据的类型
filename = './shhnwangjian.csv'
data_array = numpy.loadtxt(filename, # 文件名
delimiter=',', # 分隔符
skiprows=1, # 跳过第一行
dtype={'names':('cycle', 'type', 'matchup'),
'formats':('i4', 'S15', 'S50')}, # 数据类型
usecols=(0,2,3)) # 指定读取的列索引号 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. 蒙特卡罗方法 python 实现

    蒙特卡罗(Monte Carlo)方法的精髓:用统计结果去计算频率,从而得到真实值的近似值. 一.求圆周率的近似值,采用 投点法 import numpy as np import matplotli ...

  2. stl源码剖析 详细学习笔记deque(1)

    //--------------------------15/3/12---------------------------- deque { deque没有容量(capacity)观念,是动态分段的 ...

  3. Linux shell(5)

    shell程序流程控制的三大结构: 1. 顺序结构 2.选择结构 3.循环结构 顺序结构的定义: 顺序结构的程序设计是最简单的一种结构,它的执行顺序自上而下,依次执行,因此,我们只要按照解决问题的思路 ...

  4. GitLab篇之Linux下环境搭建

    之前公司一直在使用微软的VSS和SVN做为源代码管理工具,考虑到VSS和SVN的局限性,个人一直建议我们应该采用Git来管理我们的源代码.Git的好处不多说相信大家也都知道的.Git不仅仅是一个源代码 ...

  5. unity纯粹物理驱动方式

    首先见官方文档 In most cases you should not modify the velocity directly, as this can result in unrealistic ...

  6. Vim操作指南

    vim具有6种基本模式和5种派生模式. 基本模式 普通模式 插入模式 可视模式 选择模式 命令行模式 Ex模式 派生模式 操作符等待模式 插入普通模式 插入可视模式 插入选择模式 替换模式 1.移动光 ...

  7. one team

    Double H Team 1.队员 王熙航211606379(队长) 李冠锐211606364 曾磊鑫211606350 戴俊涵211606359 聂寒冰211606324 杨艺勇211606342 ...

  8. 剑指offer:栈的压入、弹出序列

    题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该 ...

  9. 动态规划刷题集python代码

    1 爬楼梯(Fibonacci) #有一楼梯共M级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法? def fun(m): c = [0]*m c[0] = 1 c[1] = 2 for i ...

  10. SCRUM站立会议模拟

    项目名称:连连看游戏 小组名称:计信F4 开会时间 :2016年10月11日 20:20~20:40 组长:张政 成员:张金生,武志远,李权 会议流程: 四个人模拟了一次的小组站立会议. 小组成员和组 ...