一、引入Numpy包
>>> import numpy as np
二、可供查阅的NumPy参考文档及帮助
1、网页文档:http://docs.scipy.org/
2、交互式帮助:
注意:在Python3中?方式的帮助无法识别,需要使用help()函数。
>>> import numpy as np >>> np.array? File "<stdin>", line 1 np.array? ^ SyntaxError: invalid syntax >>> help(np.array) Help on built-in function array in module numpy.core.multiarray: array(...) array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0) Create an array. ...
3、模糊查找:
>>> np.lookfor('create array') Search results for 'create array' --------------------------------- numpy.array Create an array. numpy.memmap Create a memory-map to an array stored in a *binary* file on disk. numpy.diagflat Create a two-dimensional array with the flattened input as a diagonal. numpy.fromiter Create a new 1-dimensional array from an iterable object. numpy.partition Return a partitioned copy of an array. numpy.ctypeslib.as_array Create a numpy array from a ctypes array or a ctypes POINTER. numpy.ma.diagflat Create a two-dimensional array with the flattened input as a diagonal. numpy.ma.make_mask Create a boolean mask from an array.
三、创建Numpy数组
1、一般创建方法
# 创建一维数组 >>> a = np.array([0, 1, 2, 3]) >>> a array([0, 1, 2, 3]) >>> a.ndim 1 >>> a.shape (4,) >>> len(a) 4 # 创建二维及多维数组 >>> b = np.array([[0, 1, 2], [3, 4, 5]]) # 2 x 3 array >>> b array([[0, 1, 2], [3, 4, 5]]) >>> b.ndim 2 >>> b.shape (2, 3) >>> len(b) # returns the size of the first dimension 2 >>> c = np.array([[[1], [2]], [[3], [4]]]) >>> c.shape (2, 2, 1) >>> c array([[[1], [2]], [[3], [4]]])
2、用函数创建数组
(1)序列数组-设置间隔
>>> a = np.arange(10) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> b = np.arange(1,10,2) # start, end(exclusive), step >>> b array([1, 3, 5, 7, 9])
(2)序列数组-设置数组长度
>>> c = np.linspace(0, 1, 6) # start, end, num-points >>> c array([ 0. , 0.2, 0.4, 0.6, 0.8, 1. ]) >>> c = np.linspace(0, 1, 6, endpoint=False) >>> c array([ 0. , 0.16666667, 0.33333333, 0.5 , 0.66666667, 0.83333333])
(3)常用数组的创建-一些特殊矩阵
# 全1矩阵 >>> a = np.ones((3,3)) >>> a array([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]]) # 全零矩阵 >>> b = np.zeros((2,2)) >>> b array([[ 0., 0.], [ 0., 0.]]) #单位矩阵 >>> c = np.eye(3) >>> c array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) #对角矩阵 >>> d = np.diag(np.array([1,2,3,4])) >>> d array([[1, 0, 0, 0], [0, 2, 0, 0], [0, 0, 3, 0], [0, 0, 0, 4]])
(4)随机数组
>>> a = np.random.rand(4) # uniform in [0, 1] >>> a array([ 0.41122785, 0.67154177, 0.96401834, 0.74550152]) >>> b = np.random.randn(4) # Gaussian >>> b array([ 2.04849267, 0.55180437, 0.85011143, 2.11163848]) >>> np.random.seed(1234) # Setting the random seed
四、基本数据类型
不同的数据类型允许我们将数据更紧密地存储在内存中,但是大多数时候,我们都操作的浮点型数据。注意,Numpy可以自动检测输入数据的数据类型。例如:
>>> a = np.array([1, 2, 3]) >>> a.dtype dtype('int32') >>> b = np.array([1., 2., 3.]) >>> b.dtype dtype('float64')
显式声明Numpy数组的数据类型:
>>> c = np.array([1, 2, 3], dtype=float) >>> c.dtype dtype('float64')
一般来说,函数创建Numpy数组时,缺省的数据类型是浮点型,例如:
>>> a = np.ones((3,3)) >>> a.dtype dtype('float64')
其他数据类型Numpy数组的创建:
>>> d = np.array([1+2j, 3+4j, 5+6*1j]) # 复数型 >>> d.dtype dtype('complex128') >>> e = np.array([True, False, False, True]) # 布尔型 >>> e.dtype dtype('bool') >>> f = np.array(['Bonjour', 'Hello', 'Hallo',]) #字符串型,7表示数组中字符串最多有7个字符 >>> f.dtype dtype('<U7')
五、数据可视化基础
首先,命令行开启IPython或者IPython notebook,之后让交互式绘图可用,%matplotlib(IPython) 或者 %matplotlib inline(IPython notebook)。
Matplotlib是一个二维绘图包,通常采取以下方式导入:
>>> import matplotlib.pyplot as plt >>> plt.plot(x, y) # 绘制线型图 >>> plt.show() # 显示所绘制的图形(如果已经开启了交互式绘图,可以不使用show语句)
1、绘制一维图像
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 3, 20) y = np.linspace(0, 9, 20) plt.plot(x, y) # 绘制线型图 plt.plot(x, y, 'o') # 绘制散点图 plt.show()
2、绘制二维图像(例如图片)
import numpy as np import matplotlib.pyplot as plt image = np.random.rand(30, 30) plt.imshow(image, cmap=plt.cm.hot) # 设置color map plt.colorbar() # 设置图像上显示颜色条 plt.show()
六、下标
和其他Python序列相同,Numpy数组中的元素可以通过下标访问和更改,它的下标也是从0开始的。
Python常用的序列反转的方法,Numpy数组也同样适用:
>>> a = np.arange(10) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> a[::-1] array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
多维Numpy数组的访问:
注意,在二维数组中,第一个维度对应的是行,第二个维度对应的是列;而对于更高维度的数组,维度之间的对应关系并不确定。
>>> a = np.diag(np.arange(3)) >>> a array([[0, 0, 0], [0, 1, 0], [0, 0, 2]]) >>> a[1, 1] # 第二行,第二列 1 >>> a[2, 1] = 10 # 第三行,第二列 >>> a array([[ 0, 0, 0], [ 0, 1, 0], [ 0, 10, 2]]) >>> a[1] array([0, 1, 0])
七、切片
和其他Python序列相同,Numpy数组也可以进行切片操作。
>>> a = np.arange(10) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> a[2:9:3] # [起始下标(包括):终止下标(不包括):步长] array([2, 5, 8]) >>> a[:4] # 起始下标默认为0,终止下标默认为n(数组的长度),步长默认为1 array([0, 1, 2, 3]) >>> a[1:3] # 三个参数并不是必须的 array([1, 2]) >>> a[::2] array([0, 2, 4, 6, 8]) >>> a[3:] array([3, 4, 5, 6, 7, 8, 9])
切片和赋值也可以结合起来:
>>> a = np.arange(10) >>> a[5:] = 10 >>> a array([ 0, 1, 2, 3, 4, 10, 10, 10, 10, 10]) >>> b = np.arange(5) >>> a[5:] = b[::-1] >>> a array([0, 1, 2, 3, 4, 4, 3, 2, 1, 0])
八、副本和视图
切片操作创建了一个原来Numpy数组的视图,是一种直接获取原数组的方式,原数组在内存中并不会重新复制一份。可以使用np.may_share_memory()函数来看两个数组是否共享一块内存。需要注意的是,这个函数是启发式的,所得的结果并不一定完全正确。
当对视图有所更改时,原数组也会发生相应的更改。
>>> a = np.arange(10) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> b = a[::2] >>> b array([0, 2, 4, 6, 8]) >>> np.may_share_memory(a, b) True >>> b[0] = 12 >>> b array([12, 2, 4, 6, 8]) >>> a # !!!注意 array([12, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> a = np.arange(10) >>> c = a[::2].copy() # 显式说明生成副本 >>> c[0] = 12 >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> np.may_share_memory(a, c) False
九、花式索引
索引值为一个数组,与切片不同,花式索引会创建一个原数组的副本,而不是一个原数组的视图。
1、使用布尔型数组作为索引:
>>> import numpy as np >>> np.random.seed(3) >>> a = np.random.random_integers(0, 20, 15) >>> a array([10, 3, 8, 0, 19, 10, 11, 9, 10, 6, 0, 20, 12, 7, 14]) >>> a[a % 3 == 0] array([ 3, 0, 9, 6, 0, 12]) >>> m = a[a % 3 == 0] >>> n = a[3:7] >>> np.may_share_memory(a, m) False >>> np.may_share_memory(a, n)
True
这在给数组的某个子数组赋值时很有用:
>>> a[a % 3 == 0] = -1
>>> a
array([10, -1, 8, -1, 19, 10, 11, -1, 10, -1, -1, 20, -1, 7, 14])
2、使用整数型列表作为索引
>>> a = np.arange(0, 100, 10) >>> a array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90]) >>> a[[2, 3, 2, 4, 2]] array([20, 30, 20, 40, 20]) >>> a[[9,7]] = -100 >>> a array([ 0, 10, 20, 30, 40, 50, 60, -100, 80, -100]) >>> b = a[[2, 3, 2, 4, 2]] >>> np.may_share_memory(a,b) False
也可使用整数型Numpy数组作为索引,此时得到的数组与作为索引的数组有着同样的shape。
>>> a = np.arange(10) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> idx = np.array([[2,3],[1,5]]) >>> idx.shape (2, 2) >>> a[idx] array([[2, 3], [1, 5]])