NumPy惯用【数值计算】函数总结

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])










未完待续。。。。。敬请关注













版权声明:本文为博主原创文章,未经博主允许不得转载。