第4章 NumPy基础:数组与向量化计算
NumPy
,是Numerical Python
的简称,它是目前python数值计算中最为重要的基础包,具有三个显著的优点:它的设计对于含有大量数组的数据非常有效,对于内存的使用少,它可以针对全量数组进行复杂计算而不需要写python循环。
4.1 NumPy ndarry:多维数组对象
NumPy
的核心特征之一就是N-维数组对象--ndarry
,ndarry
是python中一个快速灵活的大型数据集容器,数组允许我们使用类似于标量的操作语法在整块数据上进行数学计算。
一个ndarry
是一个通用的多维同类数据容器,也就是说,它包含的每一个元素均为相同的类型。每一个数组都有一个shape
属性,用来表征每一维度的数量
;每一个数组还有一个dtype
属性,用来描述数组的数据类型
。
在使用NumPy前,需要导入它,标准的导入方式为:
import numpy as np
4.1.1 生成ndarray
生成数组最简单的方式就是使用array
函数。array
函数接受任意的序列型对象(也包括其他数组),然后生成一个新的包含传递数据的NumPy数组。
将一个列表转换为数组:
>>>import numpy as np
#将一个列表转换为数组
>>>data1 = [6, 7.5, 8, 0, 1]
>>>arr1 = np.array(data1)
>>>arr1
array([6. , 7.5, 8. , 0. , 1. ])
而嵌套序列
,例如等长度的列表,将会自动转换成多维数组
:
>>>data2 = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
>>>arr2 = np.array(data2)
>>>arr2
rray([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
因为data2是一个包含列表的列表,因此形成的arr2数组是一个二维数组,我们可以通过检查ndim
和shape
属性来确认这一点:
>>>arr2.ndim
2
>>>arr2.shape
(3, 4)
二维数组类似我们的表格,有两个轴,0
轴代表行
,1
轴代表列
:
除非显示的指定,否则np.array
会自动推断生成数组的数据类型,可以检查它的dtype
属性来确定其类型:
>>>arr1.dtype
dtype('float64')
>>>arr2.dtype
dtype('int32')
除了np.array
,还有其他函数可以用来创建新数组。
给定长度即形状后,zeros
可以一次性创造全0
数组,ones
可以一次性创造全1
数组,而empty
则会创建一个没有初始化数值的数组,使用full
函数可以生成给定数值和形状的数组。要创建高维数组,需要向shape
传递一个元组
:
>>>np.zeros(9)
array([0., 0., 0., 0., 0., 0., 0., 0., 0.])
>>>np.ones((2,4))
array([[1., 1., 1., 1.],
[1., 1., 1., 1.]])
>>>np.empty((2, 3, 4))
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.]]])
>>>np.full((2,3),5)
array([[5, 5, 5],
[5, 5, 5]])
还有,arange
是python内建函数range
的数组版:
np.arange(15)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
4.1.2 ndarry的数据类型
数组含有一个dtype
属性。在NumPy中,没有特殊指定的话,使用上面方法生成数组的默认数据类型是float64
(浮点型),或者在生成数组的时候,使用关键字dtype
指定数据类型:
>>>arr1 = np.array([1, 2, 3], dtype=np.float64)
>>>arr2 = np.array([1, 2, 3], dtype=np.int32)
>>>arr1.dtype
dtype('float64')
>>>arr2.dtype
dtype('int32')
NumPy含有多种数据类型,但是我们一般只要注意到数据大类就可以,如浮点数、整数或者字符串等,当然我们可以通过astype
方法显示的转换数据类型:
>>>arr1 = np.array([1, 2, 3, 4, 5])
>>>arr2 = arr1.astype(np.float64)
可以看到整数转换为了浮点数
>>>arr2
array([1., 2., 3., 4., 5.])
如果将浮点数转换为整数,则小数点后的部分会被消除
,注意是消除,而不是四舍五入。
>>>arr3 = np.array([1.1, 2.2, 6.6, 8.8])
>>>arr4 = arr3.astype(np.int32)
>>>arr4
array([1, 2, 6, 8])
如果数组里面的元素是表达数字含义的字符串,也可以通过astype方法将字符串转换为数字
:
>>>arr5 = np.array(['1.1', '-2.2', '33'], dtype=np.string_)
>>>arr5
array([b'1.1', b'-2.2', b'33'], dtype='|S4')
>>>arr6 = arr5.astype(float)
>>>arr6
array([ 1.1, -2.2, 33. ])
要注意的是,使用astype
时总是生成一个新数组
,即使传入的dtype
与之前相同。
微生物基因组–细菌基因组如何变化
1,要认识到,我们测序得到的基因组序列AGCT的排列只不过代表微生物漫长岁月中的某一瞬间,不能代表过去无限远。
2,我们还要认识到,大部分基因的突变是中性的,而可以检测到的突变率是通常低于真实突变率的,因为一些致死突变会使细菌直接死掉而不能被检测到。
3,随机遗传漂移(在一个种群中,某种突变频率的增加或减少完全是由偶尔因素造成的)也是在检测基因组改变时需要考虑的,它经常在小群体中起主要作用。