在Numpy中,主要掌握的是数组array类型和矩阵matrix类型,其中matrix是array的子类型,它继承了array的所有特性并且有自己的特性。官方建议大家如果两个可以通用,那就选择array,因为array更灵活,速度更快。但是matrix的优势就是相对简单的运算符号,比如两个矩阵相乘,就是用符号*,但是array相乘不能这么用,得用方法.dot()。array的优势就是不仅仅表示二维,还能表示3、4、5...维。
一、array
Array是numpy里最基本类型,它是同类元素的多维数组。在NumPy中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank,但是和线性代数中的秩不是一样的,在用python求线代中的秩中,我们用numpy包中的linalg.matrix_rank方法计算矩阵的秩。
NumPy的数组类被称作ndarray。通常被称作数组。注意numpy.array和标准Python库类array.array并不相同,后者只处理一维数组和提供少量功能。ndarray对象属性有:
ndarray.ndim
数组轴的个数,在python的世界中,轴的个数被称作秩
ndarray.shape
数组的维度。这是一个指示数组在每个维度上大小的整数元组。例如一个n排m列的矩阵,它的shape属性将是(2,3),这个元组的长度显然是秩,即维度或者ndim属性
ndarray.size
数组元素的总个数,等于shape属性中元组元素的乘积。
ndarray.dtype
一个用来描述数组中元素类型的对象,可以通过创造或指定dtype使用标准Python类型。另外NumPy提供它自己的数据类型。
ndarray.itemsize
数组中每个元素的字节大小。例如,一个元素类型为float64的数组itemsiz属性值为8(=64/8),又如,一个元素类型为complex32的数组item属性为4(=32/8).
ndarray.data
包含实际数组元素的缓冲区,通常我们不需要使用这个属性,因为我们总是通过索引来使用数组中的元素。
1.创建array
使用array函数从常规的Python列表和元组创造数组。
a = array( [2,3,4] )
结果:array([2, 3, 4])
可使用双重序列来表示二维的数组,三重序列表示三维数组,以此类推。
b = array( [ (1.5,2,3), (4,5,6) ] )
结果:array([[ 1.5, 2. , 3. ],
[ 4. , 5. , 6. ]])
可以在创建时显式指定数组中元素的类型
c = array( [ [1,2], [3,4] ], dtype=complex)
结果:array([[ 1.+0.j, 2.+0.j],
[ 3.+0.j, 4.+0.j]])
用函数zeros可创建一个全是0的数组,用函数ones可创建一个全为1的数组,函数empty创建一个内容随机并且依赖与内存状态的数组。默认创建的数组类型(dtype)都是float64。
d = zeros((3,4))
结果:array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
NumPy提供一个类似arange的函数返回一个数列形式的数组
arange(10, 30, 5)
array([10, 15, 20, 25])
配合reshape可输出二维、三维数组等
b = arange(12).reshape(4,3)
2.基本运算
下面以点.开头的属于array的内置方法,以np.开头的属于函数。
2.1.求和 .sum()
2.2.求最大值 .max()
2.3.求最小值 .min()
2.4.求平均值 .mean()
2.5.矩阵行求和 .sum(axis=1)
2.6.矩阵列求和 .sum(axis=0)
2.7.矩阵乘法
np.dot(a,b)
也可以a.dot(b),但不等于a*b,因为a*b是数组对应位置元素相乘。
2.8.元素求平方: a**2
每个元素平方
2.9.元素求e的n次幂: np.exp(test)
元素开根号: np.sqrt(test)
2.10.向下取整: .floor()
2.11.平坦化数组: .ravel()
二维n行n列转换为一维数组
2.12.矩阵转置: .T
2.13.矩阵拼接按行(也就是竖方向拼接): np.vstack((a, b))
矩阵拼接按列(也就是横方向拼接): np.hstack((a, b))
2.14.矩阵分割按列: np.hsplit(a, 3) 和 np.hsplit(a, (3, 4))
2.15.矩阵分割按行: np.vsplit(a, 3) 和 np.vsplit(a, (3, 4))
3.复制
(1) 等号赋值:=
a和b共享数据存储内存区域,因此修改其中任意一个数组的元素都会同时修改另外一个数组或矩阵的内容
(2) 浅复制: .view()
(3) 深复制: .copy()
4.索引、切片和迭代
a[3]
a[2:5] #索引2到索引5的元素
a[::-1] #reversed a
多维数组可以每个轴有一个索引。这些索引由一个逗号分割的元组给出。
a[2,3]
b[0:5,3]
迭代多维数组
for row in b:
print row