1、NumPy是什么
机器学习中常用到一个科学计算库叫NumPy:
NumPy就是一个矩阵数组。是一个多维数组对象,称为ndarray。
如:
import numpy a = numpy.array([[1,2,3,4], [5,6,7,8], [1,3,5,7]]) print(a) print(a.ndim) print(a.shape) print(a.size) print(a.dtype) print(a.itemsize)需要注意的是:同一个NumPy数组中所有的元素必须是相同的。
2、NumPy属性介绍
NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2。每一个线性的数组称为是一个轴(axes),秩即为轴的数量。上文提到的那个ndarray就是二维数组,秩为2。
numpy中常用的对象属性:
1、ndarray.ndim:数组的维数,等于秩;
2、ndarray.shape:数组的维度,为一个标识数组在每个维度上大小的整数元组,上述ndarray的shape打印就是(3, 4);同时这个元组的长度就是数组的维数,即ndim;
3、ndarray.size:数组元素的总个数,等于shape中元素的乘积,上述ndarray的size就是12;
4、ndarray.dtype:数组中元素类型;
5、ndarray.itemsize:数组中每个元素的字节大小,上述ndarray元素是int64类型,int64占用64个bits,每个字节长度为8,所以占用64/8等于8个字节。
3、numpy的使用
1、创建一个元素为0--14,(3,5)维度的矩阵
vector = numpy.arange(15) print(vector) vector2 = vector.reshape(3,5) # 向量转换成矩阵 print(vector2) # 输出的结果为 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]]
2、指定一个矩阵,元素都为0
vector3 = numpy.zeros((3,4)) print(vector3) # 输出的结果为 [[ 0. 0. 0. 0.] [ 0. 0. 0. 0.] [ 0. 0. 0. 0.]]
3、
a = numpy.array([[1,2,3,4], [5,6,7,8], [1,3,5,7]]) print(a) print(a[:,1]) # 输出的结果为 [[1 2 3 4] [5 6 7 8] [1 3 5 7]] [2 6 3] #这个结果意思是取任意行中第1列的元素
4、
print(numpy.arange(10,30,5)) # 输出的结果为 [10 15 20 25] # 如果需要知道这个方法的意义,可以打印help函数查询,如: print(help(numpy.arange))5、
# vector3 = numpy.ones((2,3,4),dtype=numpy.int32) # vector3 = numpy.random.random((2,3)) # 利用random模块随机取数构造2行3列的数组 vector3 = numpy.linspace(0, 9, 10) # linspace从0到9平均取10个数构造数组,包含0和9 print(vector3)
6、ndarray的计算
# ndarray的计算 a = numpy.array([20,30,40,50]) b = numpy.arange(4) print(a-b) print(a-1) # 输出结果是: [20 29 38 47] [19 29 39 49]
7、矩阵的*运算和.dot运算
a = numpy.array([[1,2], [2,3]]) b = numpy.array([[1,3], [2,4]]) # print(a*b) print(a.dot(b)) # print(numpy.dot(a,b))8、矩阵幂运算和根号运算
a = numpy.arange(3) print(a) print(numpy.exp(a)) print(numpy.square(a)) #输出结果是 [0 1 2] [ 1. 2.71828183 7.3890561 ] [0 1 4]
9、numpy.floor(a)和numpy.random.random((3,4))
a = 10*numpy.random.random((3,4))
print(a)
a = numpy.floor(a)
print(a)
print(a.revel()) # 矩阵转向量
a.shape = (6,2)
print(a.T) # 矩阵的转置
# 输出结果:
[[ 5.40834281 4.269162 7.92982643 4.279437 ]
[ 7.89479131 4.06550228 1.76543625 1.47728591]
[ 9.26177306 8.97762938 6.38632298 6.02355195]]
[[ 5. 4. 7. 4.]
[ 7. 4. 1. 1.]
[ 9. 8. 6. 6.]]
[ 6. 6. 9. 3. 0. 9. 2. 2. 7. 7. 0. 6.]
[[ 6. 4. 9. 5. 2. 7.]
[ 5. 1. 0. 8. 6. 1.]]
10、矩阵拼接
a = numpy.floor(10*numpy.random.random((2,2))) b = numpy.floor(10*numpy.random.random((2,2))) print(a) print(b) print(numpy.hstack((a,b))) #横着拼 # print(numpy.vstack((a,b))) #竖着拼 # 输出结果: [[ 6. 3.] [ 8. 4.]] [[ 6. 8.] [ 2. 2.]] [[ 6. 3. 6. 8.] [ 8. 4. 2. 2.]]
11、矩阵的裁剪
a = numpy.floor(10*numpy.random.random((4,6))) print(a) print(numpy.hsplit(a,3)) print(numpy.vsplit(a,2)) # 输出的结果 [[ 9. 6. 3. 3. 5. 3.] [ 3. 4. 4. 7. 8. 7.] [ 9. 9. 0. 1. 0. 1.] [ 3. 1. 9. 1. 5. 6.]] [array([[ 9., 6.], [ 3., 4.], [ 9., 9.], [ 3., 1.]]), array([[ 3., 3.], [ 4., 7.], [ 0., 1.], [ 9., 1.]]), array([[ 5., 3.], [ 8., 7.], [ 0., 1.], [ 5., 6.]])] [array([[ 9., 6., 3., 3., 5., 3.], [ 3., 4., 4., 7., 8., 7.]]), array([[ 9., 9., 0., 1., 0., 1.], [ 3., 1., 9., 1., 5., 6.]])]
12、矩阵的复制操作
定义一个ndarray对象a,
如果b = a,则a与b所指向的地址一样,a与b的值相同,b的值改变a的值也会改变;
如果c = a.view(),则a与b所指向的地址不一样,a与c的值相同,c的值改变,a的值也会改变;
如果d = a.copy(),则a与d所指向的地址不一样,a与d的值也无关联,d的值改变,a的值不改变。
13、找矩阵中每列最大元素所在的行,并拿到最大值:
a = numpy.sin(numpy.arange(20).reshape(5,4)) print(a) maxIndex = a.argmax(axis = 0) print(maxIndex) maxData = a[maxIndex, range(a.shape[1])] print(maxData) # 输出的结果是: [[ 0. 0.84147098 0.90929743 0.14112001] [-0.7568025 -0.95892427 -0.2794155 0.6569866 ] [ 0.98935825 0.41211849 -0.54402111 -0.99999021] [-0.53657292 0.42016704 0.99060736 0.65028784] [-0.28790332 -0.96139749 -0.75098725 0.14987721]] [2 0 3 1] [ 0.98935825 0.84147098 0.99060736 0.6569866 ]