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学习指南》