欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

利用python进行数据分析

程序员文章站 2022-12-20 14:59:07
第四章4.3 使用数组进行面向数组编程使用NumPy数组可以使你利用简单的数组表达式完成多种数据操作任务,而无需写大量循环。这种利用数组表达式来替代显式循环的方法,称为向量化。向量化的数组操作会比纯python的等价实现在速度上快一到两个数量级。4.3.1 将条件逻辑作为数组操作numpy.where函数是三元表达式 x if condition else y的向量化版本,假设我们有一个布尔值数组和两个数值数组:>>>xarr = np.array([1.1, 1.2, 1.....

第四章

4.3 使用数组进行面向数组编程

使用NumPy数组可以使你利用简单的数组表达式完成多种数据操作任务,而无需写大量循环。这种利用数组表达式来替代显式循环的方法,称为向量化。向量化的数组操作会比纯python的等价实现在速度上快一到两个数量级。

4.3.1 将条件逻辑作为数组操作
numpy.where函数是三元表达式 x if condition else y的向量化版本,假设我们有一个布尔值数组和两个数值数组:

>>>xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
>>>yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
>>>cond = np.array([True, False, True, True, False])

假设codn中的元素为True时我们取xarr中对应的元素,否则取yarr中的元素。我们可以通过列表推导式来完成:

>>>result = [(x if c else y) for x, y, c in zip(xarr, yarr, cond)]
>>>result
[1.1, 2.2, 1.3, 1.4, 2.5]

当数组很大的时候,这样速度会很慢(因为所有工作都是通过解释器解释python代码来完成的),其次,当数组时多维时,就无法奏效了。np.where可以很简单的完成这个操作:

result = np.where(cond, xarr, yarr)
result
array([1.1, 2.2, 1.3, 1.4, 2.5])

np.where的第二个和第三个参数并不需要是数组,它们可以是标量。where在数据分析中的一个典型用法是根据一个数组来生成一个新数组。

假设有一个随机生成的矩阵数据,我们将其中的正值替换为2,负值替换为-2,:

>>>arr = np.random.randn(4, 4)
>>>arr
array([[ 1.2224203 ,  0.29697628,  0.86141683,  1.46057975],
       [-1.63668891,  1.52931661, -0.35769972,  0.49807377],
       [ 0.05328672,  2.68661448, -0.22916215, -1.25884081],
       [ 0.04540079, -1.28653575,  1.17694204,  1.41183152]])
>>>arr  > 0
array([[ True,  True,  True,  True],
       [False,  True, False,  True],
       [ True,  True, False, False],
       [ True, False,  True,  True]])
>>>np.where(arr > 0, 2, -2)
array([[ 2,  2,  2,  2],
       [-2,  2, -2,  2],
       [ 2,  2, -2, -2],
       [ 2, -2,  2,  2]])

np.where也可以将标量和数组联合,比如仅仅将arr中的正值设为2:

>>>np.where(arr >0, 2, arr)
array([[ 2.        ,  2.        ,  2.        ,  2.        ],
       [-1.63668891,  2.        , -0.35769972,  2.        ],
       [ 2.        ,  2.        , -0.22916215, -1.25884081],
       [ 2.        , -1.28653575,  2.        ,  2.        ]])

np.where(a, b, c)即当条件a成立时选择b,否则选择c。abc均可以是数组,但大小需要一致

4.3.2 数学和统计方法

许多关于计算整个数组统计值或关于轴向数据的数学函数,可以作为数组方法被调用。这里即可以使用数组实例的方法,也可以使用numpy函数的方法。

>>>arr = np.random.randn(4, 3)
>>>arr
array([[-1.91451063,  0.94069507, -0.14026884],
       [-0.40301299,  0.66187967,  0.06648144],
       [-1.05547603, -0.16159785,  0.06980352],
       [-0.09863652, -0.96265273, -0.15650499]])
>>>arr.mean()
-0.2628167391820317
>>>np.mean(arr)
-0.2628167391820317
>>>arr.sum()
-3.1538008701843805
>>>np.sum(arr)
-3.1538008701843805

summean等函数可以接收一个可选参数axis,这个参数可以用于计算给定轴向上的统计值,形成一个下降一纬的数组,axis关键字可以省略。

#各列的平均值
>>>arr.mean(axis=1)
array([-0.37136147,  0.10844938, -0.38242345, -0.40593141])
>>>arr.mean(1)
array([-0.37136147,  0.10844938, -0.38242345, -0.40593141])
#各行的和
>>>arr.sum(axis=0)
array([-3.47163616,  0.47832416, -0.16048887])

cumsumcumprod并不会聚合,他们产生一个中间结果:

>>>arr = np.arange(10)
>>>arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>>arr.cumsum()
array([ 0,  1,  3,  6, 10, 15, 21, 28, 36, 45], dtype=int32)

在多维数组中,cumsumcumprod这样的累积函数会返回长度相同的数组,并且也可以作用在指定轴向上。要注意的是这里的axis=0summean函数中的axis=0虽然都是指定了0轴,但是计算时却是有不同的。

>>>arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
>>>arr
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
#在0轴方向上以第一行开始向下累加,相当于计算列的累积和
>>>arr.cumsum(0)
array([[ 0,  1,  2],
       [ 3,  5,  7],
       [ 9, 12, 15]], dtype=int32)
#在1轴方向上以第一列开始累积,相当于计算行的累积积
>>>arr.cumprod(1)
array([[  0,   0,   0],
       [  3,  12,  60],
       [  6,  42, 336]], dtype=int32)

常用的基础数组统计方法如下:

方法 描述
sum 沿着轴向计算所有元素的累和,0长度的数组累和为0
mean 数学平均,0长度的数组平均值为NaN
std, var 标准差和方差,可选择*度调整(默认分母为n)
min, max 最小值和最大值
argmin, argmax 最小值和最大值的位置
cumsum 从0开始元素累积和
cumprod 从1开始元素累积积

4.3.3布尔值数组的方法
python中,布尔值True被认为是1False被认为是0,因此前面的方法可以应用于布尔值数组:

>>>arr = np.random.randn(100)
>>>(arr > 0).sum()
52

对于布尔值数组,方法any检查数组中至少有一个True,方法all检查是否每个值都是True

>>>bools = np.array([True, False, True, True, False])
>>>bools.any()
True
>>>bools.all()
False

对于非布尔值数组这些方法也适用,所有的非0元素都会被按True处理

4.3.4 排序

和python内建列表相似,numpy数组可以使用sort方法按位置排序:

>>>arr = np.random.randn(7)
>>>arr
array([ 1.25609305,  0.69217959,  1.11995653, -0.79422889,  0.04005687,
        0.19233159,  1.08350854])
>>>arr.sort()
#sort会直接改变原数组的元素顺序
>>>arr
array([-0.79422889,  0.04005687,  0.19233159,  0.69217959,  1.08350854,
        1.11995653,  1.25609305])

对于多维数组,可以传递axis值,沿着轴向对每个一维数据进行排序:

>>>arr = np.random.randn(5,3)
>>>arr
array([[-0.81191954,  1.23597697,  0.93407169],
       [-1.33508542, -0.18988307,  1.1837058 ],
       [ 0.18964561, -1.026834  , -2.09751068],
       [-0.66159557,  1.31311694, -1.45716286],
       [ 1.50580822,  1.02426128,  1.80680362]])
#沿着1轴的轴向排序,即对行排序
>>>arr.sort(1)
>>>arr
array([[-0.81191954,  0.93407169,  1.23597697],
       [-1.33508542, -0.18988307,  1.1837058 ],
       [-2.09751068, -1.026834  ,  0.18964561],
       [-1.45716286, -0.66159557,  1.31311694],
       [ 1.02426128,  1.50580822,  1.80680362]])

4.3.5 唯一值与其他集合逻辑

numpy包含一些针对以为数组的基础集合操作,常用的一个方法就是np.unique,它返回的是数组中唯一值排序后的数组:

>>>animals = np.array(['dog', 'cat', 'lion', 'dog', 'bear', 'cat', 'lion'])
>>>np.unique(animals)
array(['bear', 'cat', 'dog', 'lion'], dtype='<U4')

纯python的实现如下:

>>>sorted(set(animals))
['bear', 'cat', 'dog', 'lion']

np.in1d可以检查一个数组中的值是否在另一个数组中,并返回一个布尔值数组

>>>animals = np.array(['dog', 'cat', 'lion', 'dog', 'bear', 'cat', 'lion'])
>>>np.in1d(animals, ['dog', 'lion', 'wolf'])
array([ True, False,  True,  True, False, False,  True])

常见的数组集合操作如下:

方法 描述
unique(x) 计算x中的唯一值并排序
intersect1d(x, y) 计算x和y的交集,并排序
union1d(x, y) 计算x和y的并集,并排序
in1d(x, y) j计算x中的元素是否包含在y中,返回一个布尔值数组
setdiff1d(x,y) 差集,计算在x中但不在y中的元素
setor1d(x, y) 异或集,在x或在y中,但不属于x、y交集的元素

4.4 使用数组进行文件输入和输出

numpy可以将数据以文本或二进制的形式存入硬盘或者由硬盘载入。

使用np.savenp.load对数组进行存取,数组在默认情况下是以未压缩的格式进行存储的,后缀名是.npy。存储数组数据时,.npy的后缀会自动加到文件名后。

>>>arr = np.arange(10)
>>>np.save('xueba', arr)
>>>np.load('xueba.npy')
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

使用np.savz将多个数组作为参数存入文件中,后缀为.npz。当载入这个文件时,会得到一个字典类型的对象,可以很方便的访问单个数组:

>>>arr1 = np.arange(15)
>>>np.savez('daxueba', a=arr, b=arr1)
>>>arch = np.load('daxueba.npz')
>>>arch['b']
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

最后,可以使用savez_compressed将数据存入已压缩的文件:

np.savez_compressed('dadaxueba.npz', a=arr, b=arr1)

然后存入电脑的文件,文本编辑器是打不开的o(╯□╰)o
利用python进行数据分析

微生物基因组 – 基因组时代的细菌生物多样性概念
1,研究表明,已经定种的、在生态学上各自独特的类群,如果不考虑他们之间的生态学特征,可能属于相同的序列簇,根据其基因组特征也可以将这些类群归为一个簇。
2,除了寻找生态学上独特的种群之外,基因组方法还可以帮助阐明每个群体成员的生态学功能,以及不同种群在环境中是如何分布和共存的。
3,生态学上两个独特种群的基因水平差异可以表现为与种群间生态学差异相关的水平转移物质的差异。
4,通常根据表现型、遗传学及生态学上的独特性将细菌划分为不同的类群,在这些类群之间存在着巨大的缺口。
5,现在通常认为16S rRNA差异在1.5%以上就可以视为不同的种,尽管有些不同的种间16S rRNA差异可能小于这一标准。
6,高等有性真核生物界中,中具有相同的动力学特征,这种特性使相同种内的生物具有高度同质性,而中间则具有异质性。但是在细菌分类学中已经定名的种,并不存在独特的动力学特征,一是因为细菌分类学较多的展示了典型的代谢及假定的生态多样性,二是基因组分析证实了细菌的遗传多样性,三是多位点分析揭示了以定名的物种中存在着多基因序列簇,这些序列簇可能与生态学上的独特种群相对应,最后,研究证实多种生态学上独特的类型,因其序列及其相似,可以划分到同一个物种中。

本文地址:https://blog.csdn.net/liuninghua521/article/details/107474723