机器学习中常用到一个科学计算库叫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数组中所有的元素必须是相同的。
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个字节。
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]]
vector3 = numpy.zeros((3,4))
print(vector3)
# 输出的结果为
[[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]]
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列的元素
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 ]