在上一篇文章中,我们已经看到了如何通过numpy创建numpy中的数组,这里再重复一下:
import numpy as np
# 数组
a = [[1, 2, 3], [4, 5, 6]]
print("a:", a)
# 矩阵
b = np.array(a)
print("b:", b)
import numpy as np
# 数组
a = [[1, 2, 3], [4, 5, 6]]
print("a:", a)
# 矩阵
b = np.array(a)
print("b:", b)
执行后输出为:
a: [[1, 2, 3], [4, 5, 6]]
b: [[1 2 3]
[4 5 6]]
a: [[1, 2, 3], [4, 5, 6]]
b: [[1 2 3]
[4 5 6]]
我们可以看到python中的数组和numpy中的数组在屏幕上输出的一些细微的差异:
numpy中的数组输出中是按照行列排列的,并且元素之后是没有逗号分隔的,这样在屏幕输出上我们就能很容易看矩阵,跟数学中矩阵的书写格式比较接近。
我们也可以在创建numpy数组时通过设置dtype来指定数组中元素的类型,例如:
import numpy as np
# python数组
a = [[1, 2, 3], [4, 5, 6]]
print("a:", a)
# numpy数组
b = np.array(a, dtype=np.float)
print("b:", b)
import numpy as np
# python数组
a = [[1, 2, 3], [4, 5, 6]]
print("a:", a)
# numpy数组
b = np.array(a, dtype=np.float)
print("b:", b)
上面我们就定义了numpy数组元素的类型为float类型,其输出为:
a: [[1, 2, 3], [4, 5, 6]]
b: [[ 1. 2. 3.]
[ 4. 5. 6.]]
a: [[1, 2, 3], [4, 5, 6]]
b: [[ 1. 2. 3.]
[ 4. 5. 6.]]
在机器学习中,一般我们定义的元素类型为浮点类型np.float和整型np.int。
全0矩阵
想要输出3行4列全部为0的numpy二维数组:
import numpy as np
a = np.zeros((3,4))
print(a)
import numpy as np
a = np.zeros((3,4))
print(a)
输出为:
[[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]]
[[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]]
全1数组
我们也经常会用到全1的数组:
import numpy as np
a = np.ones((3, 4), dtype=np.float)
print(a)
import numpy as np
a = np.ones((3, 4), dtype=np.float)
print(a)
输出为:
[[ 1. 1. 1. 1.]
[ 1. 1. 1. 1.]
[ 1. 1. 1. 1.]]
[[ 1. 1. 1. 1.]
[ 1. 1. 1. 1.]
[ 1. 1. 1. 1.]]
有人可能会注意到定义几行几列的方法,例如(3, 4),这个是python中的元组类型,本质上就是一个数组,但跟数组不一样的地方是其值是只读的,也就是不可改变元组中元素的值。
生成接近于0的数组
import numpy as np
a = np.empty((3, 4), np.float)
print(a)
import numpy as np
a = np.empty((3, 4), np.float)
print(a)
输出为:
[[ 6.23042070e-307 3.56043053e-307 1.37961641e-306 2.22518251e-306]
[ 1.33511969e-306 1.24610383e-306 1.69118108e-306 8.06632139e-308]
[ 1.20160711e-306 1.69119330e-306 1.29062229e-306 1.29060531e-306]]
[[ 6.23042070e-307 3.56043053e-307 1.37961641e-306 2.22518251e-306]
[ 1.33511969e-306 1.24610383e-306 1.69118108e-306 8.06632139e-308]
[ 1.20160711e-306 1.69119330e-306 1.29062229e-306 1.29060531e-306]]
np.empty()用于生成接近于0的随机数数组。
生成有序的数列或数组
例如:生成一个从10开始到20结束(不包括结束值),步长为2的数列:
import numpy as np
a = np.arange(10, 20, 2)
print(a)
import numpy as np
a = np.arange(10, 20, 2)
print(a)
输出为:
[10 12 14 16 18]
[10 12 14 16 18]
np.arange()还是经常会用到的,看到这个函数,使我联想起python中的range函数,这两者的功能类似,先看个例子:
import numpy as np
# python中创建range对象,然后我们把它转换成list对象并打印出来
a = range(10, 20, 2)
print("python中的range对象:", list(a))
# numpy中的arange函数跟python中的range对象类似
b = np.arange(10, 20, 2)
print("numpy中的arange:", b)
import numpy as np
# python中创建range对象,然后我们把它转换成list对象并打印出来
a = range(10, 20, 2)
print("python中的range对象:", list(a))
# numpy中的arange函数跟python中的range对象类似
b = np.arange(10, 20, 2)
print("numpy中的arange:", b)
输出为:
python中的range对象: [10, 12, 14, 16, 18]
numpy中的arange: [10 12 14 16 18]
python中的range对象: [10, 12, 14, 16, 18]
numpy中的arange: [10 12 14 16 18]
这里arange可以记忆为array中的range函数。
改变数组形状
numpy数组的形状非常重要,也就是几行几列。
在进行数组/矩阵运算中要时刻关注数组/矩阵是什么样的形状,比如数组/矩阵的加法、数组/矩阵的叉乘中对其形状都有相应较严格的规定。
有时为了能够改变数组/矩阵的形状,就需要调用np.reshape()的函数。
例如:
import numpy as np
a = np.arange(12).reshape(3, 4)
print(a)
import numpy as np
a = np.arange(12).reshape(3, 4)
print(a)
输出为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
生成线段
import numpy as np
a = np.linspace(1, 10, 20)
print(a)
import numpy as np
a = np.linspace(1, 10, 20)
print(a)
输出为:
[ 1. 1.47368421 1.94736842 2.42105263 2.89473684
3.36842105 3.84210526 4.31578947 4.78947368 5.26315789
5.73684211 6.21052632 6.68421053 7.15789474 7.63157895
8.10526316 8.57894737 9.05263158 9.52631579 10. ]
[ 1. 1.47368421 1.94736842 2.42105263 2.89473684
3.36842105 3.84210526 4.31578947 4.78947368 5.26315789
5.73684211 6.21052632 6.68421053 7.15789474 7.63157895
8.10526316 8.57894737 9.05263158 9.52631579 10. ]
上述语句生成了从1开始到10,总共有20个数等距的数列。
你可以把它们想象成起始是1,终止是10,总共有20个等距点。