标准安装python里面提供了两种表示数组的方法:
- list
- array
list的缺点:
标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。这样为了保存一个简单的[1,2,3],需要有3个指针和三个整数对象。对于数值运算来说这种结构显然比较浪费内存和CPU计算时间。
array的缺点:
array对象和列表不同,它直接保存数值,和C语言的一维数组比较类似。但是由于它不支持多维,也没有各种运算函数,因此也不适合做数值运算。
所以,对于矩阵运算和矩阵处理更好的方法是,使用numpy库。
1. 创建一维矩阵和多维矩阵
使用np的array函数来创建
a = np.array([1, 2, 3, 4])
b = np.array((5, 6, 7, 8))
c = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]])
shape属性
>>> a.shape
(4,)
>>> c.shape
(3, 4)
修改shape属性的方法:
#方法1:
#修改shape属性,由原来的(3,4)改为现在的(4,3)
#修改之后,矩阵的形状也会改变
>>> c.shape = 4,3
>>> c
array([[ 1, 2, 3],
[ 4, 4, 5],
[ 6, 7, 7],
[ 8, 9, 10]])
#当某个轴的元素为-1时,将根据数组元素的个数自动计算此轴的长度
#因此下面的程序将数组c的shape改为了(2,6)
>>> c.shape = 2,-1
>>> c
array([[ 1, 2, 3, 4, 4, 5],
[ 6, 7, 7, 8, 9, 10]])
#方法2,使用reshape方法
>>> d = c.reshape((4,3))
数据元素的属性:
>>> c.dtype
dtype('int64')
#同时也可以在创建数组的时候,指明元素的类型
#指明是float
>>> np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]], dtype=np.float)
array([[ 1., 2., 3., 4.],
[ 4., 5., 6., 7.],
[ 7., 8., 9., 10.]])
#指明是complex
>>> np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]], dtype=np.complex)
array([[ 1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j],
[ 4.+0.j, 5.+0.j, 6.+0.j, 7.+0.j],
[ 7.+0.j, 8.+0.j, 9.+0.j, 10.+0.j]])
</br>
刚才创建数组的办法,都是手动输入一个序列,这样的做法,显然效率不高。numpy提供了专门创建数组的函数。
主要是两个函数:
- arange函数
- linspace函数
arange函数类似于python的range函数,通过指定开始值、终值和步长来创建一维数组,注意数组不包括终值:
>>> 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.arange(10) 等价于 np.arange(0,10,1)
linspace函数通过指定开始值、终值和元素个数来创建一维数组,可以通过endpoint关键字指定是否包括终值,缺省设置是包括终值:
#注意linspace(0,1,10) 和 linspace(0,1,11)的区别
In [2]: np.linspace(0,1,10)
Out[2]:
array([ 0. , 0.11111111, 0.22222222, 0.33333333, 0.44444444,
0.55555556, 0.66666667, 0.77777778, 0.88888889, 1. ])
In [3]: np.linspace(0,1,11)
Out[3]: array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
np.arange(args1,args2,args3) 函数和
np.linspace(args1,args2,args3) 函数
的区别在于:
arange函数的三个参数分别是区间起点,区间终点,和步长
linspace函数的三个参数分别是区间的起点,区间的终点(闭区间包含终点),这个区间包含的点
2. 访问元素
2.1 下标访问元素
>>> a = np.arange(10)
>>> a[5] # 用整数作为下标可以获取数组中的某个元素
5
2.2 切片访问元素
>>> a[3:5] # 用范围作为下标获取数组的一个切片,包括a[3]不包括a[5]
array([3, 4])
#切片的第三个参数 表示步长
array([ 0, 1, 100, 101, 4, 5, 6, 7, 8, 9])
>>> a[1:-1:2] # 范围中的第三个参数表示步长,2表示隔一个元素取一个元素
array([ 1, 101, 5, 7])
2.3 使用整数序列访问
>>> 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])
2.4 使用布尔数组访问
x=array([5, 4, 3, 2, 1])
>>> x[np.array([True, False, True, False, False])]
#输出的结果是 array([5, 3])
#布尔数组的长度不够时,不够的部分都当作False
array([4, 5, 4, 5, 5])
>>> x[np.array([True, False, True, True])]
>>> # 布尔数组的长度不够时,不够的部分都当作False
array([5, 3, 2])
3. 多维数组
多维数组的存取和一维数组类似,因为多维数组有多个轴,因此它的下标需要用多个值来表示。
能看懂这个图,就基本上理解了多维数组的访问方式了。
4. 创建一个0到1 的随机矩阵
from numpy import random
randArray = random.random(size=(2,4))
#输出
#array([[0.93848018,0.42005976,0.81470729,0.98797783],[0.12242703,0.42756378,0.59705163,0.36619101]])
5. 创建一个指定范围的随机矩阵
from numpy import random
random.randint(1,100,size=(3,3))
#输出
#array([[74,76,46],[90,16,8],[21,41,31]])
numpy的参考资料:
英文:https://docs.scipy.org/doc/numpy-dev/user/quickstart.html
中文:http://old.sebug.net/paper/books/scipydoc/numpy_intro.html