概述
感觉Python是一条不归路,只要开了一个头,就需要无止境的学下去的感觉。从Numpy开始吧,分享一下我学习Numpy的心得。Numpy的一个快速官方学习文档可以访问:https://numpy.org/devdocs/user/quickstart.html#了解更多的情况。
言归正传。Numpy是Python的一个库,用来处理数组,其中包括一维数组和多维数组。通过Numpy,可以方便的对数组进行各种算数运算,包括加减乘除(对于2维数组,有些类似矩阵的操作)。还可以通过Numpy来改变数组的结构,合并或者拆分数组。Numpy是用Python进行数据分析的一个基础。那接下来看看,如果得到一个Numpy的数组。
创建Numpy数组
Python本身是有数组类型的,Python的数组感觉和其他语言的数组并没有很大的区别,定义也基本一致。那为什么还要提供Numpy的数组。 我感觉原因可以归结为:
- Numpy数组提供更方便的算数运算。 比如矩阵的加,减,乘,除和转置。
- Numpy提供更多统计学的方法。比如数组内部的元素的加和,最大值,最小值的筛选。
- Numpy可以自由变换数组的结构,包括数组维度的变换,两个数组的组合以及数组的拆分。
从已有的Python数组创建一个Numpy数组
这些特性,都为数据分析提供了方便的基础性工具。所以当我们得到一个Python数组、元组的时候,我们可以通过下面的方式将其转换成Numpy数组
# python 的一维数组
python_array_1D = [1, 2, 3]
ndarray_from_array_1d = np.array(python_array_1D)
print(ndarray_from_array_1d)
# python 的二维数组
python_array_2D = [[1, 2], [3, 4]]
ndarry_from_array_2d = np.array(python_array_2D)
print(ndarry_from_array_2d)
# python 的元组.
python_tuple = (1, 2, 3)
ndarray_from_tuple = np.array(python_tuple)
print(ndarray_from_tuple)
感觉是因为Numpy可以支持3维以上的高阶数组,所以它不是以行列来命名数组的维度的,而是使用轴(axis)的概念。当然,一维数组只有一个轴axis=0。但是对于二维数组来说,axis=0指的应该是我们通常意义上说的行;axis=1指列。对于2维以上的数组,每增加一个维度,相应的axis就增加1。这个概念可以简单的理解为下面这个图:
可以通过ndarray.ndim(数组的ndim属性)来查看一个数组的维度。
这样,通过上面的操作,我们可以从一个已有的Python数组得到一个Numpy的数组。
使用Numpy自带的方法来创建特殊的数组
除了上面那个方法,Numpy还提供其他的方法来创建一些特殊的数组。其中arange和linspace用来创建一维数组。zeros, ones 和empty用来创建二维及以上数组。
np.arange
import Numpy as np
# aranage 可以创建整数序列的一维数组。完整的arange有三个参数:
# - 第一个参数是数列的开始数
# - 第二个参数是数列结束的数,但是这个数不会包含在序列中。例如下面这个例子,100并不在序列中
# - 第三个参数是序列增加的步长
np_arange = np.arange(1, 100, 5)
print(np_arange)
'''
Output:
[ 1 6 11 16 21 26 31 36 41 46 51 56 61 66 71 76 81 86 91 96]
[ 1. 6. 11. 16. 21. 26. 31. 36. 41. 46. 51. 56. 61. 66. 71. 76. 81. 86.
91. 96.]
'''
# 通常呢,第一个参数和第三个参数是可以省略的。
# 在省略的情况下,序列从0开始,步长为1,结束在唯一的一个参数上,但是并不包括这个参数
np_arange = np.arange(7)
print(np_arange)
'''
Output:
[0. 1. 2. 3. 4. 5. 6.]
'''
np.linspace
import Numpy as np
# linspace 同样也可以生成一个一维的数组,但是它不一定是整数,有可能包含小数。完整的linspace函数也有三个参数
# - 第一个参数是数列的开始数
# - 第二个参数是数列结束的数,这个数会包含在序列中。例如下面这个例子,12作为最后一个数被包含在序列中
# - 第三个参数是整个序列要包含的元素的个数。
linspace_value = np.linspace(1, 12, 12)
print(linspace_value)
'''
Output:
[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.]
'''
# linspace函数只能省略一个参数,就是第三个参数。
# 在省略的情况下,函数默认会产生50步数等长个数
linspace_value = np.linspace(1, 10)
print(linspace_value)
'''
Output:
[ 1. 1.18367347 1.36734694 1.55102041 1.73469388 1.91836735
2.10204082 2.28571429 2.46938776 2.65306122 2.83673469 3.02040816
3.20408163 3.3877551 3.57142857 3.75510204 3.93877551 4.12244898
4.30612245 4.48979592 4.67346939 4.85714286 5.04081633 5.2244898
5.40816327 5.59183673 5.7755102 5.95918367 6.14285714 6.32653061
6.51020408 6.69387755 6.87755102 7.06122449 7.24489796 7.42857143
7.6122449 7.79591837 7.97959184 8.16326531 8.34693878 8.53061224
8.71428571 8.89795918 9.08163265 9.26530612 9.44897959 9.63265306
9.81632653 10. ]
'''
# 与arange不同的是, linspace的开始数可以比结束的数大。这样步长即为负数
linspace_value = np.linspace(50, 1)
print(linspace_value)
'''
[50. 49. 48. 47. 46. 45. 44. 43. 42. 41. 40. 39. 38. 37. 36. 35. 34. 33.
32. 31. 30. 29. 28. 27. 26. 25. 24. 23. 22. 21. 20. 19. 18. 17. 16. 15.
14. 13. 12. 11. 10. 9. 8. 7. 6. 5. 4. 3. 2. 1.]
'''
np.arange和np.linspace都用来产生一维数组,他们的不同之处在于:
- arange知道序列的步长,但是无法确定序列的个数(单个参数除外);linspace知道序列的个数但步长无法确定
- arange生成的序列是升序序列;linspace可以升序也可以降序
下面来看看用Numpy特殊函数创建二维已经更高维数组
- np.zeros((n, ..., m))
- np.ones((n, ..., m))
- np.empty((n, ..., m))
三个函数都以元组作为参数。元组的个数,象征着数组的维度。元组中的每个数,象征着在这个维度上的数组,包含多少个元素。
# 下面这个参数(2, 3),元组的个数是2,说明数组是2维的。
# 2表示axis=0这个方向上的数组包含两个元素
# 3表示axis=1这个方向上的数组包含三个元素
zeros_array = np.zeros((2, 3))
print(zeros_array)
'''
Output:
[[0. 0. 0.]
[0. 0. 0.]]
'''
# 下面这个参数(3, 3),元组的个数是3,说明数组是3维的。
# 1表示axis=0这个方向上的数组包含一个元素
# 2表示axis=1这个方向上的数组包含两个元素
# 3表示axis=2这个方向上的数组包含三个元素
zeros_array = np.zeros((1, 2, 3))
print(zeros_array)
'''
Output:
[[[0. 0. 0.]
[0. 0. 0.]]]
'''
# 同样的道理也适用于np.ones和np.empty
ones_array = np.ones((2, 3))
print(ones_array)
'''
Output:
[[1. 1. 1.]
[1. 1. 1.]]
'''
ones_array = np.ones((1, 2, 3))
print(ones_array)
'''
Output:
[[[1. 1. 1.]
[1. 1. 1.]]]
'''
empty_array = np.empty((2, 3))
print(empty_array)
'''
Output:
[[50. 49. 48.]
[ 3. 2. 1.]]
'''
empty_array = np.empty((1, 2, 3))
print(empty_array)
'''
Output:
[[[50. 49. 48.]
[ 3. 2. 1.]]]
'''
可以用一个表格来对比这几个函数的区别
维度 | 数字范围 | |
np.range(start, end, step) | 一维 | 从start开始,到end结束, 步长为step的一维序列 |
np.linspace(start, end, size) | 一维 | 从start开始,到end结束, 步长相等的size个数的序列 |
np.zeros((n, m...)) | 维度有参数决定。(n,m)是二维,(n,p,m)是三维,以此类推 | 用0填充所有的位置 |
np.ones((n,m…)) | 同上 | 用1填充所有的位置 |
np.empty((n,m…)) | 同上 | 用随机数填充所有的位置 |
如果想查看数组的维度,可以通过ndarray.shape来查看
<<< Numpy的学习笔记 - 前言 Numpy的学习笔记(二)>>>
最后
以上就是生动大地为你收集整理的Numpy的学习笔记(一) - 用Numpy创建数组的全部内容,希望文章能够帮你解决Numpy的学习笔记(一) - 用Numpy创建数组所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复