重点预告:下面要讲,NumPy 的入门和数组的常用方式
1、NumPy 很强的
虽然 Python 中的 List 可以当作数组来用,但 List 中的元素能设置成任意类型的,就像大乱炖一样,维护起来的成本很高。List 为了能区分它们,会额外保存 List 中每个对象的指针,哪怕一个简单的 [1, 2, 3] 都要对应开辟三个指针来指向三个整数对象。如果进行数值运算的话,采用 List 这种结构,效率明显是低效的。还有 Python 中的 array 模块,它也没很丰富的运算函数供调用,而且它仅仅能处理一维数组,不支持多维数组。
所以,Python 数值运算这块儿还是有瓶颈的,但好在 NumPy 的出现完美弥补上了这一不足,NumPy 支持多维度数组和矩阵运算,还额外提供了大量的专业数学函数库,更强的是,NumPy 对很多主流三方库,比如 Pandas、SciPy 提供了底层实现。
2、使用 NumPy
如果你已经安装并使用 Anaconda,恭喜你,NumPy 已经被默认安装好了。在你使用的时候,直接导入 NumPy 模块就好了,非常的方便,导入方式如下:
# 导入 numpy 模块,取个别名 np import numpy as np
3、NumPy 数组
终于迎来了第一个悍将 —— ndarray 对象,它就是 NumPy 支持多维数组的对象,它要求所包含的元素的类型必须是一致的。
先来看第一个常用方法:array(),用于生成 NumPy 数组,你可以给它传任意数据类型。
如果创建 NumPy 数组的数据类型不一致,则它会向上转型来保持数据源类型的统一性。比如说,既有 int 类型,又有 float 类型,由于 float 的精度更高,所以 NumPy 会把所有数据都自动转成 float 类型,也就是「乖乖地跟着大哥走」。
# 列表中,有 int 和 float 两种不同类型的数据 myData = [1, 2.22, 3, 4, 5.0] # 将其转成 NumPy myData = np.array(myData) # 输出数组 myData
输出如下:
array([1. , 2.22, 3. , 4. , 5. ])
如果你要看数组元素的类型,直接通过 dtype 属性就可以查看了,比如 myData 的数据类型是 float64。
# 通过 dtype 属性,查看数据类型 myData.dtype
输出如下:
dtype('float64')
如果我想转成指定类型的数据呢?直接通过 astype() 方法就可以实现,比如,转成 int32 :
# 强制转成 int32 类型 myData.astype(np.int32)
输出如下:
array([1, 2, 3, 4, 5], dtype=int32)
多维数组的创建方式,也一样,不过,是需要把一个数组嵌套到另一个数组中,你看:
# 创建多维数组 myData2 = [[1,2,3,4,5], [6,7,8,9,10]] myData2 = np.array(myData2) myData2
上面创建了一个数组,里面包含了两个小数组,小数组都有五个数组元素,输出如下:
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
如果你要更细致地创建数组,可以使用 arange() 函数,它跟 Python 内置的 range() 函数类似,但 range() 只能用来循环迭代,返回的是一个可迭代对象,而 arange() 函数返回的数组,还可以当作向量,能做更多运算。
# 对比,返回的类型不一样 print(type(np.arange(10))) print(type(range(10)))
输出如下:
<class 'numpy.ndarray'>
<class 'range'>
arange() 函数还能指定起始值(start,默认为 0)、终止值(stop,取值区间是左闭右开,取左不取右的值)、步长(step,默认为 1)、返回 ndarray 的数据类型等参数(dtype,不强制指定,则默认为原数据类型)。
# 创建一个包含 100 个元素的数组 myData3 = np.arange(100) print(myData3)
输出如下:
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
96 97 98 99]
arange() 函数返回的数组,可运算,让他们各自都加上 2 :
# 让每个元素都加上 2 print(myData3 + 2)
输出如下:
[ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
92 93 94 95 96 97 98 99 100 101]
还可以在创建数组的时候,指定步长,相当于等差数列,每个元素之间相差指定的数值(可以是任意实数):
# 指定步长为 10 myData4 = np.arange(0, 20, 3) myData4
输出如下:
array([ 0, 3, 6, 9, 12, 15, 18])
再来个更好用的,如果我想自动生成(其实就是不想自己算)一个指定范围和指定等差的数组,可以用 linspace() 函数实现。
# 生成一个指定范围和指定等差的数组 myData5 = np.linspace(0,100,30) myData5
也就是,在 0~100 的范围内,自动生成 30 个等差数据并返回数组,根本不需要自己去人肉手动计算,非常方便,输出如下:
array([ 0. , 3.44827586, 6.89655172, 10.34482759,
13.79310345, 17.24137931, 20.68965517, 24.13793103,
27.5862069 , 31.03448276, 34.48275862, 37.93103448,
41.37931034, 44.82758621, 48.27586207, 51.72413793,
55.17241379, 58.62068966, 62.06896552, 65.51724138,
68.96551724, 72.4137931 , 75.86206897, 79.31034483,
82.75862069, 86.20689655, 89.65517241, 93.10344828,
96.55172414, 100. ])
今日分享结束,欢迎大家点赞、在看、评论、赞赏一条龙,让我感受你对我浓浓的爱,感谢你的支持。
最后
我是帅帅,一个默默做了 7 年的 Java 编程、架构师成长教练。
很喜欢罗曼·罗兰的一句话:“人最可贵之处在于看透生活的本质后,依然热爱生活 ”。
愿我们一起,努力追寻本质,依然保持热爱。
如果想交个朋友,帅帅等你来聊