简单的说 NumPy就是Python众多库中的其中一个 可以用来做科学计算。NumPy包的核心是 ndarray 对象。它封装了python原生的同数据类型的 n 维数组 为了保证其性能优良 其中有许多操作都是代码在本地进行编译后执行的。
如果想了解更多可以前往什么是 NumPy学习更多 如果英语水平不错的话也可以看What is NumPy 。
基础知识NumPy 库中数组被调用ndarry 也被叫为array。但是numpy.array和标准的Python中的array.array并不一样 后者只能处理一维数据 而前者可以实现多维的数据处理。
ndarry有以下的属性
ndarry.ndim 数组的维的个数。ndarray.shape 数组的维度 输出(n,m) 表示数组是一个n行m列的矩阵。ndarray.size 数组元素的总数。这等于 shape 的元素的乘积。ndarray.dtype 一个描述数组中元素类型的对象。可以使用标准的Python类型创建或指定dtype。ndarray.itemsize 数组中每个元素的字节大小。ndarry.data 该缓冲区包含数组的实际元素。通常 我们不需要使用此属性 因为我们将使用索引访问数组中的元素。为了方便 直接将NumPy中的例子搬运过来了
# 导入NumPy库并称为np import numpy as np # 创建一个三行五列的数组a a np.arange(15).reshape(3, 5) array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) a.shape (3, 5) a.ndim a.dtype.name int64 a.itemsize a.size type(a) type numpy.ndarray b np.array([6, 7, 8]) array([6, 7, 8]) type(b) type numpy.ndarray创建数组
创建数组最基本的方法是a numpy.array([x1, x2, x3]),常见的创建数组有以下几种方法
import numpy as np # 创建一维数组 a np.array([2,3,4]) array([2, 3, 4]) # 创建二维数组 b np.array([(1.5,2,3), (4,5,6)]) array([[ 1.5, 2. , 3. ], [ 4. , 5. , 6. ]]) #创建复数的二维数组 c np.array( [ [1,2], [3,4] ], dtype complex ) array([[ 1. 0.j, 2. 0.j], [ 3. 0.j, 4. 0.j]]) # 创建3行4列的元素全为0的数组 np.zeros( (3,4) ) array([[ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.]]) # 创建2页3行4列的元素全为1的数组 np.ones( (2,3,4), dtype np.int16 ) # dtype can also be specified array([[[ 1, 1, 1, 1], [ 1, 1, 1, 1], [ 1, 1, 1, 1]], [[ 1, 1, 1, 1], [ 1, 1, 1, 1], [ 1, 1, 1, 1]]], dtype int16) # 创建一个2行3列的元素值随机的数组 np.empty( (2,3) ) # uninitialized, output may vary array([[ 3.73603959e-262, 6.02658058e-154, 6.55490914e-260], [ 5.30498948e-313, 3.14673309e-307, 1.00000000e 000]]) # 创建范围等距离的数组 np.arange( 10, 30, 5 ) array([10, 15, 20, 25]) np.arange( 0, 2, 0.3 ) # it accepts float arguments array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8]) # 此外 还可以像MATLAB中一样 用linspace创建数组 from numpy import pi np.linspace( 0, 2, 9 ) # 9 numbers from 0 to 2 array([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ]) x np.linspace( 0, 2*pi, 100 ) # useful to evaluate function at lots of points f np.sin(x)数组的打印
使用print语句可以输出数组 例如
a np.arange(6) # 1d array print(a) [0 1 2 3 4 5] b np.arange(12).reshape(4,3) # 2d array print(b) [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]] c np.arange(24).reshape(2,3,4) # 3d array print(c) [[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[12 13 14 15] [16 17 18 19] [20 21 22 23]]]运算操作
数组上的运算一般是对元素进行操作的 因此有下面例子
a np.array( [20,30,40,50] ) b np.arange( 4 ) array([0, 1, 2, 3]) c a-b array([20, 29, 38, 47]) b**2 array([0, 1, 4, 9]) 10*np.sin(a) array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854]) a 35 array([ True, True, False, False])
此外还有 、* 这些运算符也是可以对数组进行操作的 并且也是直接对数组的 元素进行操作
a np.ones((2,3), dtype int) b np.random.random((2,3)) a * 3 array([[3, 3, 3], [3, 3, 3]]) array([[ 3.417022 , 3.72032449, 3.00011437], [ 3.30233257, 3.14675589, 3.09233859]]) a b # b is not automatically converted to integer type Traceback (most recent call last): TypeError: Cannot cast ufunc add output from dtype( float64 ) to dtype( int64 ) with casting rule same_kind
可以看出每个运算符的操作对象都是元素 然而学过线性代数都知道矩阵相乘遵循前行乘后列的规则 因此对于矩阵之间的乘法有新的运算符 在Python 3.5中 或用 dot函数执行
A np.array( [[1,1], ... [0,1]] ) B np.array( [[2,0], ... [3,4]] ) A * B # elementwise product array([[2, 0], [0, 4]]) A B # matrix product array([[5, 4], [3, 4]]) A.dot(B) # another matrix product array([[5, 4], [3, 4]])
本文所有代码均来自NumPy官网 仅对其稍加修改。



