本文共 3005 字,大约阅读时间需要 10 分钟。
Numpy是高性能科学计算和数据分析的基础包,是Python在科学计算领域使用最广的一个包。
Python中用列表保存一组值,可将列表当成是数组使用。此外,Python有array模块,但它不支持多维数组,无论是列表还是array模块都没有科学运算函数,不适合做矩阵等科学计算。因此,numpy没有使用Python本身的数组机制,而是提供了ndarray数组对象,该对象能方便的存取数组,而且拥有丰富的数组计算函数,比如向量的加法、减法、乘法等。
使用ndarray数组,首先需要导入numpy函数库,也可以直接导入该函数库:
from numpy import *
使用别名导入
import numpy as np
创建数组时进行数组计算的先决条件,可以通过array()函数定义数组实例对象,其参数为Python的序列对象(比如列表)。如果想定义多维数组,则传递多层嵌套的序列。
例如下面这条语句定义了一个二维数组,其大小为(2,3),即有2行,3列
a = np.array([[1,2,4.0],[3,6,9]])a
array([[1., 2., 4.], [3., 6., 9.]])
接着我们看下数组的一些属性:
# 查看行数a.ndim
2
# 查看数组的维数,返回(n,m) 其中n为行数,m为列数a.shape
(2, 3)
# 查看元素的类型,比如numpy.int32 numpy..float64a.dtype
dtype('float64')
numpy的特殊数组主要有以下几种:
zeros数组:全零数组,元素全为0; ones数组:全1数组,元素权威1; empty数组:空数组,元素全近似为0;
# 全零数组的创建np.zeros((2,3))
array([[0., 0., 0.], [0., 0., 0.]])
# 全1数组的创建np.ones((3,5))
array([[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]])
# 空数组的创建np.empty((3,3))
array([[0.00000000e+000, 0.00000000e+000, 0.00000000e+000], [0.00000000e+000, 0.00000000e+000, 5.09875747e-321], [6.95165821e-310, 6.95165821e-310, 6.95181720e-310]])
arange函数:它与Python的range函数相似,但它也属于numpy库,其参数依次为:开始值、结束值、步长。
np.arange(1,20,5)
array([ 1, 6, 11, 16])
我们还可以使用linspace函数创建等差序列数组,其参数依次为:开始值、结束值、元素数量。
np.linspace(0,2,9)
array([0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])
numpy数组的每个元素、每行元素、每列元素都可以用索引访问,不过注意:索引是从0开始的。其操作和列表基本相同。
a = np.array([[1,2,4.0],[3,6,9]])a
array([[1., 2., 4.], [3., 6., 9.]])
# 取a的第一行元素a[0]
array([1., 2., 4.])
# 取a的第二列元素a[:,1]
array([2., 6.])
# 取a的第一行的第三个元素a[0,2]
4.0
a = np.array([1,2,3])b = np.array([4.,5,6])
# 加法运算a + b
array([5, 7, 9])
# 减法运算a - b
array([-3., -3., -3.])
# 乘法运算a * b
array([ 4., 10., 18.])
# 乘法运算:a的2次方a ** 2
array([1, 4, 9], dtype=int32)
# 除法运算a / b
array([0.25, 0.4 , 0.5 ])
# 数组点乘np.dot(a,b)
32.0
# 判断大小,返回bool值a >= 2
array([False, True, True])
# a中最大的元素a.max()
3
# a中最小的元素a.min()
1
# a的和a.sum()
6
数组的拷贝分为浅拷贝和深拷贝两种,浅拷贝通过数组变量的复制完成,深拷贝使用数组对象的copy方法完成。
浅拷贝只拷贝数组的引用,如果对拷贝对象修改。原数组也将修改。
下面的代码演示了浅拷贝的方法:
a = np.ones((2,3))a
array([[1., 1., 1.], [1., 1., 1.]])
# b为a的浅拷贝b = ab
array([[1., 1., 1.], [1., 1., 1.]])
# 对b进行修改,a也会被修改b[1,2] = 9a
array([[1., 1., 1.], [1., 1., 9.]])
深拷贝会复制一份和原数组一样的数组,但他们在内存中是分开存放的,所以改变拷贝数组,原数组不会改变。
下面的代码演示了b使用copy方法从原数组a复制一份拷贝的情况
a = np.ones((2,3))a
array([[1., 1., 1.], [1., 1., 1.]])
b = a.copy()b[1,2] = 9b
array([[1., 1., 1.], [1., 1., 9.]])
a
array([[1., 1., 1.], [1., 1., 1.]])
numpy的矩阵对象与数组对象相似,主要不同之处在于,矩阵对象的计算遵循矩阵数学运算规律。矩阵使用matrix函数创建,以(2,2)大小的矩阵为例(2行2列),定义方法如下:
A = np.matrix([[1.0,2.0],[3.0,4.0]])A
matrix([[1., 2.], [3., 4.]])
# 查看A的类型type(A)
numpy.matrixlib.defmatrix.matrix
矩阵的常用运算有转置、乘法、求逆等。下面的代码演示了矩阵的基本运算。
# 转置A.T
matrix([[1., 3.], [2., 4.]])
B = np.matrix([[3.0],[5.0]])B
matrix([[3.], [5.]])
# 矩阵乘法A * B
matrix([[13.], [29.]])
# 逆矩阵A.I
matrix([[-2. , 1. ], [ 1.5, -0.5]])
转载地址:http://ddzdf.baihongyu.com/