一、文件读取
numpy.genfromtxt() 可以用来读取各种文件。常用语法大致如下:
numpy.genfromtxt(fname, dtype=<type 'float'>, delimiter=None, skip_header=0, skip_footer=0)
fname 要导入的文件路径
dtype 指定要导入文件的类型,dtype=str / int等等
delimiter 文件中不同元素间的间隔方式,空格还是逗号什么的,如:delimiter=',';
skip_header 是否跳过开头行,一般第一行为类别,为0不跳过,为1或者2则跳过前面1或者2行
import numpy students = numpy.genfromtxt("student_list.txt", delimiter=",",dtype=str, skip_header=0)
二、构造ndarray
1、NumPy的数组类被称作ndarray,通常被称作数组。
np.array只是一个便捷的函数,用来创建一个ndarray,它本身不是一个类。
ndarray:N维数组对象(矩阵),所有元素必须是相同类型。
ndarray属性:
ndim属性,表示维度个数;
shape属性,表示各维度大小;
dtype属性,表示数据类型。
创建ndarray数组函数:
array和asarray都可以将结构数据转化为ndarray,但是主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会,直接指向A的地址。
numpy.array()构造 ndarray
numpy.array()中传入数组参数,可以是一维的也可以是二维三维的。numpy 会将其转变成 ndarray 的结构。
vector = numpy.array([1,2,3,4])
matrix = numpy.array([[1,2,3],[4,5,6]])
传入的参数必须是同一结构,不是同一结构将发生转换。
vector = numpy.array([1,2,3,4]) # 均为int型 array([1, 2, 3, 4]) vector = numpy.array([1,2,3,4.0]) # 转为float类型 array([ 1., 2., 3., 4.]) vector = numpy.array([1,2,'3',4]) # 转为str类型 array(['1', '2', '3', '4'],dtype='<U21')
利用 .shape 查看结构
能够了解 array 的结构,debug 时通过查看结构能够更好地了解程序运行的过程。
print(vector.shape) print(matrix.shape) (4,) (2, 3)
利用 dtype 查看类型
vector = numpy.array([1,2,3,4]) vector.dtype dtype('int64')
ndim 查看维度
vector = numpy.array([1,2,3,4]) vector.ndim 1 matrix = numpy.array([[1,2,3], [4,5,6], [7,8,9]]) matrix.ndim 2
size 查看元素数量
matrix.size 9
2、数组和矩阵matrix的区别(matrix 和 array的区别)
- Numpy matrix必须是2维的,但是 numpy arrays (ndarrays) 可以是多维的(1D,2D,3D····ND). Matrix是Array的一个小的分支,包含于Array。所以matrix 拥有array的所有特性。但这时候,官方建议大家如果两个可以通用,那就选择array,因为array更灵活,速度更快,很多人把二维的array也翻译成矩阵。
- 但是matrix的优势就是相对简单的运算符号,比如两个矩阵相乘,就是用符号*,但是array相乘不能这么用,得用方法.dot()
- matrix 和 array 都可以通过objects后面加
.T得到其转置。但是 matrix objects 还可以在后面加.H得到共轭矩阵, 加.I得到逆矩阵。 - 在numpy里面arrays遵从逐个元素的运算,所以array:c 和d的c*d为对应元素相乘,而矩阵相乘,则需要numpy里面的dot命令 。
a=np.mat('4 3; 2 1') b=np.mat('1 2; 3 4') print(a) # [[4 3] # [2 1]] print(b) # [[1 2] # [3 4]] print(a*b) # [[13 20] # [ 5 8]] c=np.array([[4, 3], [2, 1]]) d=np.array([[1, 2], [3, 4]]) print(c*d) # [[4 6] # [6 4]] print(np.dot(c,d)) # [[13 20] # [ 5 8]]
>>> a=np.mat([[4+2j 3], [2 1]]) >>> a matrix([[ 4.+2.j, 3.+0.j], [ 2.+0.j, 1.+0.j]]) >>> a.H matrix([[ 4.-2.j, 2.-0.j], [ 3.-0.j, 1.-0.j]]) >>> a.I matrix([[-0.25-0.25j, 0.75+0.75j], [ 0.50+0.5j , -0.50-1.5j ]])>>> b=np.array([[4, 3], [2, 1]]) >>> b.T array([[4, 2], [3, 1]]) >>> b.H Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'numpy.ndarray' object has no attribute 'H'
-
**运算符的作用也不一样
a=np.mat([[4,3], [2,1]]) c=np.array([[4, 3], [2, 1]]) print(a**2) # [[22 15] # [10 7]] print(c**2) # [[16 9] # [ 4 1]]
因为a是个matrix,所以a**2返回的是a*a,相当于矩阵相乘。而c是array,c**2相当于,c中的元素逐个求平方。
问题就出来了,如果一个程序里面既有matrix 又有array,会让人脑袋大。但是如果只用array,你不仅可以实现matrix所有的功能,还减少了编程和阅读的麻烦。
三、获取与计算
numpy 能使用切片获取数据
matrix = numpy.array([[1,2,3], [4,5,6], [7,8,9]]) >>> matrix[1,1] 5 >>> matrix[0,2] 3 >>> matrix[1,] array([4, 5, 6]) >>> matrix[1] array([4, 5, 6]) >>> matrix[1][0] 4 >>> matrix[:,1] array([2, 5, 8])
>>> matrix[1,...]
array([4, 5, 6])
>>> matrix[...,1]
array([2, 5, 8])
根据条件获取
numpy 能够依次比较 vector 和元素之间是否相同
vector = numpy.array([5, 10, 15, 20]) vector == 10 array([False, True, False, False], dtype=bool) vector = numpy.array([5, 10, 15, 20]) equal_to_ten = (vector == 10) print(equal_to_ten) print(vector[equal_to_ten]) [False True False False] [10] vector = numpy.array([5, 10, 15, 20]) equal_to_ten_and_five = (vector == 10) & (vector == 5) vector = numpy.array([5, 10, 15, 20]) equal_to_ten_or_five = (vector == 10) | (vector == 5)
类型转换
将整体类型进行转换
vector = numpy.array([5, 10, 15, 20]) print(vector.dtype) vector = vector.astype(str) print(vector.dtype) int64 <U21
求和
sum() 能够对 ndarray 进行各种求和操作,比如分别按行按列进行求和,sum(1) 是 sum(axis=1)) 的缩写,1表示按照 x轴方向求和,0表示按照y轴方向求和
matrix = numpy.array([[1,2,3], [4,5,6], [7,8,9]]) print(matrix.sum()) print(matrix.sum(1)) print(matrix.sum(0)) 45 [ 6 15 24] [12 15 18]
四、 常用函数
reshape
生成从 0-14 的 15 个数字,使用 reshape(3,5) 将其构造成一个三行五列的 array。