python之Numpy使用
2015-10-03 22:03
766 查看
Numpy是高性能计算和数据分析的基础包:它的功能如下:
1)、ndarray:一个具有矢量运算和复杂广播能力的快速且节省空间的多维数组。
2)、用于对整组数据进行标准运算的数学函数
3)、用于读写磁盘数据的工具以及用于操作内存映射文件的工具
4)、线性代数、随机数生成以及傅里叶变换功能
5)、用于集成C/C++等语言编写代码的工具
一、基础篇
1、ndarray:一种多维数组对象
NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(通常是元素是数字)。在NumPy中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。
例如,在3D空间一个点的坐标
NumPy的数组类被称作ndarray。通常被称作数组。注意numpy.array和标准Python库类array.array并不相同,后者只处理一维数组和提供少量功能。更多重要ndarray对象属性有:
ndarray.ndim
数组轴的个数,在python的世界中,轴的个数被称作秩
ndarray.shape
数组的维度。这是一个指示数组在每个维度上大小的整数元组。例如一个n排m列的矩阵,它的shape属性将是(2,3),这个元组的长度显然是秩,即维度或者ndim属性
ndarray.size
数组元素的总个数,等于shape属性中元组元素的乘积。
ndarray.dtype
一个用来描述数组中元素类型的对象,可以通过创造或指定dtype使用标准Python类型。另外NumPy提供它自己的数据类型。
ndarray.itemsize
数组中每个元素的字节大小。例如,一个元素类型为float64的数组itemsiz属性值为8(=64/8),又如,一个元素类型为complex32的数组item属性为4(=32/8).
ndarray.data
包含实际数组元素的缓冲区,通常我们不需要使用这个属性,因为我们总是通过索引来使用数组中的元素。
创建ndarray
zeros和ones分别可以创建指定长度或形状的全0全1数组,empty则返回没有具体值的数组。
数组创建函数
数组和标量之间的运算
基本的索引和切片
切片索引
ndarry的切片语法和python的列表类似
注意:只有冒号表示选取整个轴
花式索引
是numpy的术语,指的是利用整数数组进行索引
选取子行:
数组转置和轴对换
2、通用函数:快速的元素级数组函数
ufunc是universal function的缩写,它是一种能对数组的每个元素进行操作的函数。NumPy内置的许多ufunc函数都是在C语言级别实现的,因此它们的计算速度非常快。
将条件逻辑表达式表述为数组运算
numpy.where是三元表达式 x if condition else y的矢量化版本
数学和统计方法
http://reverland.org/python/2012/08/22/numpy/#section-6 二、通用函数
1)、ndarray:一个具有矢量运算和复杂广播能力的快速且节省空间的多维数组。
2)、用于对整组数据进行标准运算的数学函数
3)、用于读写磁盘数据的工具以及用于操作内存映射文件的工具
4)、线性代数、随机数生成以及傅里叶变换功能
5)、用于集成C/C++等语言编写代码的工具
一、基础篇
1、ndarray:一种多维数组对象
NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(通常是元素是数字)。在NumPy中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。
例如,在3D空间一个点的坐标
[1, 2, 3]是一个秩为1的数组,因为它只有一个轴。那个轴长度为3.又例如,在以下例子中,数组的秩为2(它有两个维度).第一个维度长度为2,第二个维度长度为3.
[[ 1., 0., 0.], [ 0., 1., 2.]]
NumPy的数组类被称作ndarray。通常被称作数组。注意numpy.array和标准Python库类array.array并不相同,后者只处理一维数组和提供少量功能。更多重要ndarray对象属性有:
ndarray.ndim
数组轴的个数,在python的世界中,轴的个数被称作秩
ndarray.shape
数组的维度。这是一个指示数组在每个维度上大小的整数元组。例如一个n排m列的矩阵,它的shape属性将是(2,3),这个元组的长度显然是秩,即维度或者ndim属性
ndarray.size
数组元素的总个数,等于shape属性中元组元素的乘积。
ndarray.dtype
一个用来描述数组中元素类型的对象,可以通过创造或指定dtype使用标准Python类型。另外NumPy提供它自己的数据类型。
ndarray.itemsize
数组中每个元素的字节大小。例如,一个元素类型为float64的数组itemsiz属性值为8(=64/8),又如,一个元素类型为complex32的数组item属性为4(=32/8).
ndarray.data
包含实际数组元素的缓冲区,通常我们不需要使用这个属性,因为我们总是通过索引来使用数组中的元素。
创建ndarray
>>> import numpy as np >>> data = [6,7,5,8,0,1] >>> arr = np.array(data) >>> arr array([6, 7, 5, 8, 0, 1]) >>>
>>> data2=[[1,2,3,4],[5,6,7,8]] >>> arr2=np.array(data2) >>> arr2 array([[1, 2, 3, 4], [5, 6, 7, 8]]) >>>
>>> arr.ndim 1 >>> arr2.ndim 2 >>> arr.shape (6,) >>> arr2.shape (2, 4)
>>> arr.dtype dtype('int64') >>> arr2.dtype dtype('int64') >>>
>>> np.zeros(10) array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) >>> np.zeros((3,6)) array([[ 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0.]]) >>> np.ones(5) array([ 1., 1., 1., 1., 1.]) >>> np.empty(2,3,2) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: data type not understood >>> np.empty((2,3,2)) array([[[ 0.00000000e+000, 0.00000000e+000], [ 1.23516411e-322, 0.00000000e+000], [ 7.30242818e-304, 0.00000000e+000]], [[ 0.00000000e+000, -1.52916882e+113], [ 0.00000000e+000, 0.00000000e+000], [ 1.12541323e-111, 0.00000000e+000]]]) >>>
zeros和ones分别可以创建指定长度或形状的全0全1数组,empty则返回没有具体值的数组。
数组创建函数
>>> np.arange(15) array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])ndarray的数据类型
>>> import numpy as np
>>> np.arange(15) array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
>>> arr = np.array([1,2,3],dtype=np.float64)
>>> arr.dtype
dtype('float64')
>>> int_arr=arr.astype(np.int64)
>>> int_arr
array([1, 2, 3])
>>> int_arr.dtype
dtype('int64')
>>> numeric_strings =np.array(['1.25','-9.6','42'],dtype.string_)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'dtype' is not defined
>>> numeric_strings =np.array(['1.25','-9.6','42'],dtype = np.string_)
>>> numeric_strings
array([b'1.25', b'-9.6', b'42'],
dtype='|S4')
>>> numeric_strings.dtype
dtype('S4')
>>> numeric_strings.astype(float)
array([ 1.25, -9.6 , 42. ])
>>> numeric_strings.dtype
dtype('S4')
数组和标量之间的运算
>>> arr = np.array([[1,2,3],[4,5,6]]) >>> arr array([[1, 2, 3], [4, 5, 6]]) >>> arr * arr array([[ 1, 4, 9], [16, 25, 36]]) >>> 1 / arr array([[ 1. , 0.5 , 0.33333333], [ 0.25 , 0.2 , 0.16666667]]) >>> arr **0.5 array([[ 1. , 1.41421356, 1.73205081], [ 2. , 2.23606798, 2.44948974]])
基本的索引和切片
>>> arr = np.arange(10) >>> arr array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> arr[5] 5 >>> arr[5:8] array([5, 6, 7]) >>> arr[5:8] = 10 >>> arr array([ 0, 1, 2, 3, 4, 10, 10, 10, 8, 9])多维数组
>>> arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]]) >>> arr2d[2] array([7, 8, 9]) >>> arr2d[0][2] 3 >>> arr2d[0] =10 >>> arr2d array([[10, 10, 10], [ 4, 5, 6], [ 7, 8, 9]])
切片索引
ndarry的切片语法和python的列表类似
>>> arr[1:6] array([ 1, 2, 3, 4, 10]) >>> arr2d[:2] array([[10, 10, 10], [ 4, 5, 6]]) >>> arr2d[:2,1:] array([[10, 10], [ 5, 6]])
注意:只有冒号表示选取整个轴
>>> arr2d[:,:1] array([[10], [ 4], [ 7]])布尔型索引
>>> names = np.array(['Bob','Joe','Will','Boe','Bill','Joe']) >>> data = np.random.randn(7,4) >>> data array([[ 0.79695103, 0.0299971 , -0.59623186, -0.24272421], [-1.69125924, -0.67068454, -0.31525311, -1.72922377], [-1.29614427, -0.51628036, -0.1137131 , -0.88153765], [-0.47269362, -0.20382923, 0.10858334, 0.54570916], [-0.71040368, -1.41826188, -1.17867401, 1.07643113], [ 1.00396752, 0.46841433, 0.58578778, 0.6859775 ], [ 0.53684137, -0.2065546 , -1.29747978, 0.03839398]]) >>> names array(['Bob', 'Joe', 'Will', 'Boe', 'Bill', 'Joe'], dtype='<U4') >>>假设每个名字都对应data数组中得一行,而我们想选出对应名字“Bob”的所有行
>>> names=='Bob' True >>> names = np.array(['Bob','Joe','Will','Boe','Bill','Joe']) >>> names=='Bob' array([ True, False, False, False, False, False], dtype=bool) >>> data[names=='Bob'] array([[ 0.79695103, 0.0299971 , -0.59623186, -0.24272421]]) >>> data[names=='Bob',2:] array([[-0.59623186, -0.24272421]]) >>> names != 'Bob' array([False, True, True, True, True, True], dtype=bool)>> mask=(names=='Bob')|(names=='Will') >>> mask array([ True, False, True, False, False, False], dtype=bool) >>>
花式索引
是numpy的术语,指的是利用整数数组进行索引
>>> arr = np.empty((8,4))>>> for i in range(8): ... arr[i]=i ... >>> arr array([[ 0., 0., 0., 0.], [ 1., 1., 1., 1.], [ 2., 2., 2., 2.], [ 3., 3., 3., 3.], [ 4., 4., 4., 4.], [ 5., 5., 5., 5.], [ 6., 6., 6., 6.], [ 7., 7., 7., 7.]]) >>>
选取子行:
>>> arr = np.empty((8,4)) >>> for i in range(8): ... arr[i]=i ... >>> >>> arr array([[ 0., 0., 0., 0.], [ 1., 1., 1., 1.], [ 2., 2., 2., 2.], [ 3., 3., 3., 3.], [ 4., 4., 4., 4.], [ 5., 5., 5., 5.], [ 6., 6., 6., 6.], [ 7., 7., 7., 7.]]) >>> arr[[4,3,0,6]] array([[ 4., 4., 4., 4.], [ 3., 3., 3., 3.], [ 0., 0., 0., 0.], [ 6., 6., 6., 6.]]) >>> arr[[-3,-5,-7]] array([[ 5., 5., 5., 5.], [ 3., 3., 3., 3.], [ 1., 1., 1., 1.]]) >>> arr=np.arange(32).reshape((8,4)) >>> arr array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23], [24, 25, 26, 27], [28, 29, 30, 31]]) >>> arr[[1,5,7,2],[0,3,1,2]] array([ 4, 23, 29, 10]) >>>
数组转置和轴对换
>>> arr array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23], [24, 25, 26, 27], [28, 29, 30, 31]]) >>> arr.T array([[ 0, 4, 8, 12, 16, 20, 24, 28], [ 1, 5, 9, 13, 17, 21, 25, 29], [ 2, 6, 10, 14, 18, 22, 26, 30], [ 3, 7, 11, 15, 19, 23, 27, 31]]) >>>利用np.dot计算矩阵内积XtX:
>>> arr =np.random.randn(6,3) >>> arr array([[ 2.06975813, -0.85796742, 0.19999776], [-0.01597614, 1.72374268, 0.16050437], [ 2.07838301, 1.04537751, 0.69326084], [-1.4849106 , -0.38374416, 0.73700956], [-0.31204997, 0.368051 , 0.05084386], [-0.63419748, -0.90331828, 2.53133718]]) >>> np.dot(arr.T,arr) array([[ 11.30837101, 1.3972287 , -0.86338249], [ 1.3972287 , 5.89891606, -1.72091715], [ -0.86338249, -1.72091715, 7.49980746]]) >>>对于高维数组,transpose需要轴编号才能转置
2、通用函数:快速的元素级数组函数
ufunc是universal function的缩写,它是一种能对数组的每个元素进行操作的函数。NumPy内置的许多ufunc函数都是在C语言级别实现的,因此它们的计算速度非常快。
>>> points=np.arange(-5,5,0.01) #1000个间隔点 >>> xs,ys=np.meshgrid(points,points) >>> xs array([[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99], [-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99], [-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99], ..., [-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99], [-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99], [-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99]]) >>> z = np.sqrt(xs**2+ys**2) >>> z array([[ 7.07106781, 7.06400028, 7.05693985, ..., 7.04988652, 7.05693985, 7.06400028], [ 7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815, 7.05692568], [ 7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354, 7.04985815], ..., [ 7.04988652, 7.04279774, 7.03571603, ..., 7.0286414 , 7.03571603, 7.04279774], [ 7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354, 7.04985815], [ 7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815, 7.05692568]]) >>> plt.imshow(z,cmap=plt.cm.gray);plt.colorbar() <matplotlib.image.AxesImage object at 0x10789e390> <matplotlib.colorbar.Colorbar object at 0x1078b2e10> >>> plt.title("Image plot of $\sqrt{x^2+y^2}$ for a grid of values") <matplotlib.text.Text object at 0x10787a518>
将条件逻辑表达式表述为数组运算
numpy.where是三元表达式 x if condition else y的矢量化版本
>>> xarr=np.array([1.1,1.2,1.3,1.4,1.5]) >>> yarr=np.array([2.1,2.2,2.3,2.4,2.5]) >>> cond=np.array([True,False,True,True,False]) >>> result=np.where(cond,xarr,yarr) >>> result array([ 1.1, 2.2, 1.3, 1.4, 2.5]) >>>
数学和统计方法
>>> import numpy as np >>> arr = np.random.randn(5,4) >>> arr.mean() -0.22696057024253907 >>> arr.sum() -4.5392114048507812 >>> arr array([[-0.70841945, -0.05771976, 0.56725563, -0.12069791], [ 1.97462838, 0.94100408, -0.44880957, -1.33849321], [-2.85873 , 0.19188458, 0.43721548, 1.46197352], [ 0.87946223, -1.49055119, 0.35200715, 1.5240487 ], [-1.34499714, -1.77287332, -1.85514668, -0.87225292]])
http://reverland.org/python/2012/08/22/numpy/#section-6 二、通用函数
相关文章推荐
- 【python问题系列--2】脚本运行出现语法错误:IndentationError: unindent does not match any outer indentation level
- 1.Python深入_对象的属性
- python闭包
- Python核心编程笔记 - 杂记第1章至第8章
- 如何在Windows 下安装Python
- 【Python】二分查找算法
- 八大排序算法的Python实现
- 【Python之旅】第五篇(三):Python Socket多线程并发
- 2.Python深入_上下文管理器
- python学习笔记——自定义模块导入
- 【Python之旅】第五篇(二):Python Socket单线程+阻塞模式
- 【Python之旅】第五篇(二):Python Socket单线程+阻塞模式
- Python学习笔记<list,tuple,range再探>
- Python学习笔记<list,tuple,range再探>
- 【Python之旅】第五篇(一):Python Socket通信原理
- 【Python之旅】第五篇(一):Python Socket通信原理
- Python核心编程笔记 - 第11章 函数式编程
- python搭建web应用框架以及一些基本语法
- 191. Number of 1 Bits Leetcode Python
- 使用urllib编写python爬虫