Python现在是最热门的人工智能语言,各种工具的支持如Google的Tensorflow,都是首选支持Python的。
但是,与R语言不同,Python语言设计时,并没有考虑对于矩阵运算,统计计算等功能做专项支持。于是我们需要NumPy库来补足这一能力上的不足。
NumPy是Python的著名扩展库,相当于Python中的MATLAB。
Numpy 中,ndarray 类具有六个参数,它们分别为:
- shape:数组的形状。
- dtype:数据类型。
- buffer:对象暴露缓冲区接口。
- offset:数组数据的偏移量。
- strides:数据步长。
- order:{'C','F'},以行或列为主排列顺序。
如何生成多维数组
初识ndarray多维数组
在算法中我们最经常用到的就是矩阵,我们就从矩阵开始说起吧。
NumPy中,使用二维的多维数组ndarray来存储矩阵。
例:
1
|
a3 = np.array([[ 1 , 0 ],[ 0 , 1 ]])
|
会生成这样一个多维数组对象
1
2
|
array([[ 1 , 0 ],
[ 0 , 1 ]])
|
生成数组序列
通过开始值、结束值和步长值生成数组序列 - arange
可以通过arange函数来生成指定开始值,结束值和步长值的一维数组。请注意,结束值并不包含在序列中,也就是说结束值是开区间。
1
2
3
4
|
In [ 25 ]: a4 = np.arange( 1 , 10 , 1 )
In [ 26 ]: a4
Out[ 26 ]: array([ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ])
|
线性序列 - linspace
与arange类似,linspace通过给定初值、终值和元素个数来生成序列。是否包含终值可以通过endpoint属性来设置。
例:
1
2
3
4
|
In [ 37 ]: a8 = np.linspace( 1 , 10 , 10 ,endpoint = True )
In [ 38 ]: a8
Out[ 38 ]: array([ 1. , 2. , 3. , 4. , 5. , 6. , 7. , 8. , 9. , 10. ])
|
等比序列 - logspace
除了线性的等差数列,我们也可以通过等比数列的方式来生成一维数组。
默认是以10的n次方为参数,比如logspace(0,4,3)的意思是,初值为10的0次方,即1,终值是10的4次方,即100,一共生成3个值。
例,生成[1,100,10000]
1
2
3
4
|
In [ 47 ]: a9 = np.logspace( 0 , 4 , 3 )
In [ 48 ]: a9
Out[ 48 ]: array([ 1.00000000e + 00 , 1.00000000e + 02 , 1.00000000e + 04 ])
|
我们当然也可以修改基数,比如改成3:
1
2
3
4
|
In [ 53 ]: a10 = np.logspace( 1 , 5 , 3 ,base = 3 )
In [ 54 ]: a10
Out[ 54 ]: array([ 3. , 27. , 243. ])
|
改变多维数组的形状
如果有一个一维数组要转为多维数组,可以通过修改shape属性来实现。
我们可以先将数据存在一维数组中,可以用列表或者元组来生成一维数组,它们是等价的:
例:
1
2
3
4
5
6
7
8
9
|
In [ 2 ]: a1 = np.array([ 1 , 2 , 3 , 4 ])
In [ 3 ]: a1
Out[ 3 ]: array([ 1 , 2 , 3 , 4 ])
In [ 4 ]: a2 = np.array(( 1 , 0 , 0 , 1 ))
In [ 5 ]: a2
Out[ 5 ]: array([ 1 , 0 , 0 , 1 ])
|
我们通过shape属性来查看一个数组的形状:
1
2
3
4
5
|
In [ 14 ]: a1.shape
Out[ 14 ]: ( 4 ,)
In [ 15 ]: a2.shape
Out[ 15 ]: ( 4 ,)
|
shape属性是可以直接修改的,比如我们想把上面的a1改成2 x 2的矩阵,就直接改shape值就是了:
1
2
3
4
5
6
|
In [ 16 ]: a1.shape = 2 , 2
In [ 17 ]: a1
Out[ 17 ]:
array([[ 1 , 2 ],
[ 3 , 4 ]])
|
如果能确定一个轴,另一个可以赋-1让系统自己去算。
例:
1
2
3
4
5
6
|
In [ 18 ]: a2.shape = 2 , - 1
In [ 19 ]: a2
Out[ 19 ]:
array([[ 1 , 0 ],
[ 0 , 1 ]])
|
如果想保持这个数组不变,生成一个形状改变的新数组,可以调用reshape方法。
例:我们将一个25个元素的数组生成一个5x5的新数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
In [ 59 ]: a11 = np.linspace( 1 , 100 , 25 )
In [ 60 ]: a11
Out[ 60 ]:
array([ 1. , 5.125 , 9.25 , 13.375 , 17.5 , 21.625 ,
25.75 , 29.875 , 34. , 38.125 , 42.25 , 46.375 ,
50.5 , 54.625 , 58.75 , 62.875 , 67. , 71.125 ,
75.25 , 79.375 , 83.5 , 87.625 , 91.75 , 95.875 , 100. ])
In [ 61 ]: a12 = a11.reshape( 5 , - 1 )
In [ 62 ]: a12
Out[ 62 ]:
array([[ 1. , 5.125 , 9.25 , 13.375 , 17.5 ],
[ 21.625 , 25.75 , 29.875 , 34. , 38.125 ],
[ 42.25 , 46.375 , 50.5 , 54.625 , 58.75 ],
[ 62.875 , 67. , 71.125 , 75.25 , 79.375 ],
[ 83.5 , 87.625 , 91.75 , 95.875 , 100. ]])
|
直接生成多维数组
生成全0的数组
zeros生成全是0的数组,第一个参数是shape
例:
1
2
3
4
5
6
7
8
9
10
11
12
|
In [ 65 ]: np.zeros(( 10 , 10 ))
Out[ 65 ]:
array([[ 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. , 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
2
3
4
5
6
7
|
In [ 66 ]: np.ones(( 5 , 5 ))
Out[ 66 ]:
array([[ 1. , 1. , 1. , 1. , 1. ],
[ 1. , 1. , 1. , 1. , 1. ],
[ 1. , 1. , 1. , 1. , 1. ],
[ 1. , 1. , 1. , 1. , 1. ],
[ 1. , 1. , 1. , 1. , 1. ]])
|
只生成空数组
empty不赋初值,是最快速的方法
例:
1
2
3
4
5
|
In [ 67 ]: np.empty(( 3 , 3 ))
Out[ 67 ]:
array([[ 1. , 2.125 , 3.25 ],
[ 4.375 , 5.5 , 6.625 ],
[ 7.75 , 8.875 , 10. ]])
|
通过函数来生成数组
通过fromfunction函数可以通过一个函数来生成想要的数组。
例,生成九九乘法表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
In [ 125 ]: def mul2(x,y):
...: return (x + 1 ) * (y + 1 )
...:
In [ 126 ]: np.fromfunction(mul2,( 9 , 9 ))
Out[ 126 ]:
array([[ 1. , 2. , 3. , 4. , 5. , 6. , 7. , 8. , 9. ],
[ 2. , 4. , 6. , 8. , 10. , 12. , 14. , 16. , 18. ],
[ 3. , 6. , 9. , 12. , 15. , 18. , 21. , 24. , 27. ],
[ 4. , 8. , 12. , 16. , 20. , 24. , 28. , 32. , 36. ],
[ 5. , 10. , 15. , 20. , 25. , 30. , 35. , 40. , 45. ],
[ 6. , 12. , 18. , 24. , 30. , 36. , 42. , 48. , 54. ],
[ 7. , 14. , 21. , 28. , 35. , 42. , 49. , 56. , 63. ],
[ 8. , 16. , 24. , 32. , 40. , 48. , 56. , 64. , 72. ],
[ 9. , 18. , 27. , 36. , 45. , 54. , 63. , 72. , 81. ]])
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://juejin.im/entry/5a4dd9c2f265da432480deac