在上一篇《手把手陪您学Python》47——ndarray中,我们学习了NumPy的ndarray,并通过对比Excel,了解了多维数组以及ndarray在处理多维数组方面的优势。
今天,我们将介绍ndarray的生成方法。
1、array()函数
生成ndarray最简单的方法就是使用array()函数,通过接收列表、字典、元组、集合等我们在入门阶段学习的序列型对象,生成数组。还可以通过接收其他的数组,生成一个新数组。
array函数就像我们之前学习的int()、str()、list()、tuple()、set()等函数一样,起到一个类型转换的作用。
下面通过几个实例来看一下array()是如何将其他序列型对象转化为数组的。
要使用NumPy里的函数或者方法,首先要使用我们在入门阶段学习的模块导入的方法,导入NumPy库,并按照习惯使用np作为别名,避免NumPy库中的函数和基础库发生冲突。
在后面的学习中,我们也会使用同样的方法导入其他的库,并不再进行特别说明。
In [1]: import numpy as np
In [2]: data1 = [1, 2, 3, 4, 5, 6] # 列表转化为数组
np.array(data1)
Out[2]: array([1, 2, 3, 4, 5, 6])
In [3]: data2 = (1, 2, 3, 4, 5, 6) # 元组转化为数组
np.array(data2)
Out[3]: array([1, 2, 3, 4, 5, 6])
对于嵌套序列,如果每个元素的长度都相同,array函数将会自动将其转化为多维数组。
In [4]: data3 = [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]] # 嵌套列表转化为多维数组
np.array(data3)
Out[4]: array([[ 1, 2, 3, 4, 5, 6],
[ 7, 8, 9, 10, 11, 12]])
In [5]: data4 = ((1, 2, 3, 4, 5, 6), (7, 8, 9, 10, 11, 12)) # 嵌套元组转化为多维数组
np.array(data4)
Out[5]: array([[ 1, 2, 3, 4, 5, 6],
[ 7, 8, 9, 10, 11, 12]])
In [6]: data5 = ([1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]) # 列表嵌套元组转化为多维数组
np.array(data5)
Out[6]: array([[ 1, 2, 3, 4, 5, 6],
[ 7, 8, 9, 10, 11, 12]])
In [7]: data6 = [(1, 2, 3, 4, 5, 6), (7, 8, 9, 10, 11, 12)] # 元组嵌套列表转化为多维数组
np.array(data6)
Out[7]: array([[ 1, 2, 3, 4, 5, 6],
[ 7, 8, 9, 10, 11, 12]])
从以上转化过程我们可以看到,无论是列表转化成的数组,还是元组转化成的数组,最后的表现形式都是列表,对于多维数组就是嵌套数组。
事实上,这就是NumPy中数组的表示方法,即使用列表或者嵌套列表,表示一维或者多维数组。
至于前面的array,因为我们使用的是Jupyter Notebook,所以在没有使用print()函数时,会同时显示其格式。如果我们将结果打印一下,就会出现只由[]组成的数组表现形式了。
In [8]: data7 = [1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]
print(np.array(data7))
Out[8]: [[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]]
在上面的实例中,除了增加一组列表外,我们还省略的最外面的一层[]或者(),此时就会默认为是元组,就和我们之前在入门阶段所学的原则是一样的。我们可以通过直接打印data7的方法来验证一下:
In [9]: print(data7)
Out[9]: ([1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18])
可以看到,打印后外层的()就显示出来了,并且不会影响我们生成数组,所以我们后面可以省略最外面的一层(),只要知道它是一个元组就可以了。
当然了,也可以使用tpye()函数进行验证,大家可以试一下。
2、arange()函数
在入门阶段中,我们学习过生成整数数字序列列表的函数range(),大家可以点击链接《手把手陪您学Python》18——循环语句for回顾一下他的语法格式以及作用。
arange()函数可以说就是range()函数的数组版,他的作用是生成整数数字序列的数组,使用方法非常简单。
In [10]: np.arange(6)
Out[10]: array([0, 1, 2, 3, 4, 5])
In [11]: np.arange(1, 13)
Out[11]: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
In [12]: np.arange(1, 13, 2)
Out[12]: array([ 1, 3, 5, 7, 9, 11])
In [13]: np.arange(13, 1, -2)
Out[13]: array([13, 11, 9, 7, 5, 3])
上面对arange()函数几种生成数组的方法进行了列举,与range()函数的方法相同,具体的解释这里就不过多介绍了,可以继续参考《手把手陪您学Python》18——循环语句for中的内容。
3、linspace()函数
arange()函数是在起点和终点之间按照指定的步长构建数组,而linspace()函数则是在起点和终点之间,按照指定的元素个数构建一个等差数组。
所以,如果间距是确定的,那么就用arange()函数;如果个数是确定的,那么就用linspace()函数。
如果不指定元素的个数,那么linspace()默认会生成50个元素。
In [14]: np.linspace(1, 10, 10)
Out[14]: array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
In [15]: np.linspace(10, 1, 10)
Out[15]: array([10., 9., 8., 7., 6., 5., 4., 3., 2., 1.])
In [16]: np.linspace(1, 10) # 未指定元素个数,默认50个元素
Out[16]: array([ 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. ])
可以看到,使用argange()和linspace()函数生成的数组都是一维的,至于生成多维数组的方法,我们会在下一篇进行介绍。
以上就是三种常用的生成数组的方法的介绍,同时也学习到了数组的表示方法。
下一篇,我们会学习数组的shape属性,敬请关注。
感谢阅读本文!如有任何问题,欢迎留言,一起交流讨论^_^
要阅读《手把手陪您学Python》——NumPy系列文章的其他篇目,请关注公众号点击菜单选择,或点击下方链接直达。
《手把手陪您学Python》系列文章入门阶段的篇目已经全部完成。
为更加清晰地展示Python入门阶段的知识体系,整理了如下的鱼骨图,以方便大家查阅。
如要阅读相应篇目的内容,请关注公众号点击菜单选择,或点击下方链接直达。
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》5——Jupyter Notebook
For Fans:关注“亦说Python”公众号,回复“手47”,即可免费下载本篇文章所用示例语句。
