NumPy惯用【数值计算】函数总结
标准的Python使用list保存一组值(相当于数组),但由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。这样为了保存一个简单的[1,2,3],需要有3个指针和三个整数对象。这对于数值运算来说浪费内存和CPU计算时间。
NumPy提供了两种基本的对象:ndarray(N-dimensional array object)和 ufunc(universal function object)。ndarray是存储单一数据类型的多维数组,而ufunc则是能够对数组进行处理的函数。
(从现在开始,我们把python中的数组叫做list,把numpy中的array叫做数组)
导入模块:
import numy as np
# if use "from numpy import *", we can use eye(3) directly,
# but i recommend you to use numpy as "import numpy as np"
使用numpy的第一步,就要将python的list转换为高效的numpy的array(一维、二维)数组:
>>> a = np.array([1, 2, 3, 4]) >>> b = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]]) >>> a array([5, 6, 7, 8]) >>> b array([[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]])
获取数组大小:
np.shape(a) np.shape(a)[0] np.shape(a)[1] a.shape a.shape[0] a.shape[1]
上面先构建list,再转换为array,显然效率不高;numpy提供很多专门创建特殊数组的函数:
1)一些特殊的数组(矩阵):
e = np.eye(3) #dtype=float e_int = np.eye(3, dtype=int) o = np.ones(3) #dtype=float o_int_matrix = o_matrix = np.ones((2,3), dtype=int) z = zeros(3) z_int_matrix = zeros((2, 3), dtype = int)2)生成等距数组:
>>> np.arange(0,1,0.1) array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]) >>> np.linspace(0, 1, 12) array([ 0. , 0.09090909, 0.18181818, 0.27272727, 0.36363636, 0.45454545, 0.54545455, 0.63636364, 0.72727273, 0.81818182, 0.90909091, 1. ]) >>> np.logspace(0, 2, 20) array([ 1. , 1.27427499, 1.62377674, 2.06913808, 2.6366509 , 3.35981829, 4.2813324 , 5.45559478, 6.95192796, 8.8586679 , 11.28837892, 14.38449888, 18.32980711, 23.35721469, 29.76351442, 37.92690191, 48.32930239, 61.58482111, 78.47599704, 100. ])
3)产生随机数组:
<pre name="code" class="python">>>> <span style="font-family: sans-serif; line-height: 20.7999992370605px;">np.random.rand(10)</span>array([ 0.33290844, 0.31970138, 0.51067686, 0.99145672, 0.74182408, 0.78678035, 0.51937447, 0.46332929, 0.45999905, 0.9774472 ])
上面用到的参数:startPoint、endPoint、span、size,关于是否包含endPoint,可以通过参数指定,具体查看函数原型。
arange类似于python的range函数;linspace产生等差数列;logspace产生等比数列,startPoint=10^1、endPoint=10^2。
random.rand,产生10个介于0-1之间的数据。
读取数组中的元素:
获取数组的切片、每隔一定步长取一个元素、倒序索引、省略下标等
>>> a = np.arange(10) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> a[5] # 用整数作为下标可以获取数组中的某个元素 5 >>> a[3:5] # 用范围作为下标获取数组的一个切片,包括a[3]不包括a[5] array([3, 4]) >>> a[:5] # 省略开始下标,表示从a[0]开始 array([0, 1, 2, 3, 4]) >>> a[3:] # 省略结束下标,表示从a[-1]结束 array([3, 4, 5, 6, 7, 8, 9]) >>> a[:-1] # 下标可以使用负数,表示从数组后往前数 array([0, 1, 2, 3, 4, 5, 6, 7, 8]) >>> a[2:4] = 100,101 # 下标还可以用来修改元素的值 >>> a array([ 0, 1, 100, 101, 4, 5, 6, 7, 8, 9]) >>> a[1:-1:2] # 范围中的第三个参数表示步长,2表示隔一个元素取一个元素 array([ 1, 101, 5, 7]) >>> a[::-1] # 省略范围的开始下标和结束下标,步长为-1,整个数组头尾颠倒 array([ 9, 8, 7, 6, 5, 4, 101, 100, 1, 0]) >>> a[5:1:-2] # 步长为负数时,开始下标必须大于结束下标 array([ 5, 101])
注意:
上面通过切片的形式获取的子数组是原数组的一个视图,与原数组共享内存数据空间,一个变化,另外一个也变化(浅拷贝、镜像view等意思):
>>> b=a[3:7] >>> b array([3, 4, 5, 6]) >>> b[2]=0 >>> b array([3, 4, 0, 6]) >>> a array([0, 1, 2, 3, 4, 0, 6, 7, 8, 9])
要想获得具有独立的内存空间的新数组,需要深拷贝,使用copy()方法:
>>> b=a >>> b is a True >>> b = a.copy() >>> b is a False
</pre><pre>或者直接使用整数序列来进行深拷贝:
>>> x = np.arange(10,1,-1) >>> x array([10, 9, 8, 7, 6, 5, 4, 3, 2]) >>> x[[3, 3, 1, 8]] # 获取x中的下标为3, 3, 1, 8的4个元素,组成一个新的数组 array([7, 7, 9, 2]) >>> b = x[np.array([3,3,1,8])] >>> b array([7, 7, 9, 2]) >>> b[2] = 100 array([7, 7, 100, 2]) >>> x # 由于b和x不共享数据空间,因此x中的值并没有改变 array([10, 9, 8, 7, 6, 5, 4, 3, 2]) >>> x[[3,5,1]] = -1, -2, -3 # 整数序列下标也可以用来修改元素的值 >>> x array([10, -3, 8, -1, 6, -2, 4, 3, 2])
未完待续。。。。。敬请关注
版权声明:本文为博主原创文章,未经博主允许不得转载。