NumPy基础:数组与向量化计算
NumPy,是Numerical Python的简称,它是利用Python进行数值运算的最为重要的基础包。
重要的原因可以归纳为三点:
- 可以有效的处理含有大量数组的数据。
- NumPy的算法是基于C语言编写的,NumPy数组使用的内存量小于其他的Python内建序列。
- NumPy可以针对全量数组进行复杂计算而不需要使用Python循环。
下面的例子将展示NumPy的不同,定义一个NumPy数组,里面存放着1M个整数,再定义一个列表,同样存放着1M个整数,将这两个序列同时乘以2,比较它们运算时间的差异。
In [8]: import numpy as np
In [9]: my_arr = np.arange(1000000)
In [10]: my_list = list(np.arange(1000000))
In [12]: %timeit my_arr2=my_arr*2
2.21 ms ± 19.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [13]: %timeit my_list2=[x*2 for x in my_list]
200 ms ± 1.18 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
NumPy ndarray:多维数组对象
ndarray是Python中一个快速、灵活的多维同类数据容器,也就是说,它包含的每一个元素都是相同的数据类型。每一个数组都有一个shape属性,用来表征数组每一个维度的数量;每一个数组都有一个dtype属性,用来描述数组的数据类型。
In [14]: data = np.random.randn(2,3)
In [15]: data
Out[15]:
array([[ 0.1049642 , -0.52542354, -0.07641538],
[ 0.5484492 , -0.95387232, 0.84849499]])
In [18]: data.shape
Out[18]: (2, 3)
In [19]: data.dtype
Out[19]: dtype('float64')
建议使用标准的NumPy导入方式import numpy as np,numpy这个命名空间中包含了大量与Python内建函数重名的函数(比如min,max)。
In [9]: np.arange(10) Out[9]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) #arange是python内建函数range的数组版
不论是“数组”,“NumPy数组”还是“ndarray”,它们都表示同一个对象,ndarray对象。
1、生成ndarray
1.1 使用array函数生成数组
In [21]: data1=[6.,3.4,9.,0.,1.]
In [22]: arr1=np.array(data1)
In [23]: arr1
Out[23]: array([6. , 3.4, 9. , 0. , 1. ])
In [24]: data2=[1,2,3],[4,5,6]
In [25]: arr2=np.array(data2)
In [26]: arr2
Out[26]:
array([[1, 2, 3],
[4, 5, 6]])
1.2 使用其他函数创建新数组
In [5]: np.zeros(10)
Out[5]: array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
In [6]: np.zeros((3,6))
Out[6]:
array([[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.]])
In [7]: np.empty((2,3,2))
Out[7]:
array([[[6.23042070e-307, 1.89146896e-307],
[1.37961302e-306, 6.23053614e-307],
[6.23053954e-307, 9.34609790e-307]],
[[8.45593934e-307, 9.34600963e-307],
[2.13621758e-306, 6.89804132e-307],
[1.11261162e-306, 8.34443015e-308]]])
表1展示的是标准数组的生成函数。由于NumPy专注于数值计算,没有特别指明的话,默认的数值类型为浮点型(float64)。
表1:数组生成函数
函数名 | 描述 |
---|---|
array | 将输入数据(列表、元组、数组、序列或其他)转换成ndarray,如不显式指明数据类型,将自动推断;默认复制所有的输入数据 |
asarray | 将输入转换为ndarray,但如果输入已经是nadarray则不再复制 |
arange | Python内建函数arrange的数组版,返回一个数组 |
ones | 根据给定形状和数据类型生成一个全1数组 |
ones_like | 根据所给的数组生成一个形状一样的全1数组 |
zeros | 根据给定形状和数据类型生成一个全0数组 |
zeros_like | 根据所给的数组生成一个形状一样的全0数组 |
empty | 根据给定形状和数据类型生成一个没有初始化数值的空数组 |
empty_like | 根据所给的数组生成一个形状一样的没有初始化数值的空数组 |
full | 根据给定形状和数据类型生成指定数值的数组 |
full_like | 根据所给的数组生成一个形状一样的内容为指定数值的数组 |
eye,identity | 生成一个N*N特征矩阵(对角线位置为1,其余位置为0) |
2、ndarray的数据类型
数据类型 ,即dtype,表示数组里存储的数据类型,对于初学者,仅需要知道数据大类有哪些:浮点型、整数、布尔值、字符串以及某个python对象。
In [19]: arr1=np.array([1,2,3])
In [20]: arr1=np.array([1,2,3],dtype=np.float64)
In [21]: arr1.dtype
Out[21]: dtype('float64')
表2展示的是NumPy所支持的所有数据类型。
表2:Nu