第4章 NumPy基础:数组和矢量计算

NumPy(Numerical Python的简称)是Python数值计算最重要的基础包。大多数提供科学计算的包都是⽤NumPy的数组作为构建基础。
NumPy的部分功能如下:

ndarray,⼀个具有矢量算术运算和复杂⼴播能力的快速且节省空间的多维数组。
⽤于对整组数据进⾏快速运算的标准数学函数无需编写循环)。
用于读写磁盘数据的工具以及用于操作内存映射文件的工具具。
线性代数、随机数⽣成以及傅里叶变换功能。
用于集成由C、C++、Fortran等语⾔编写的代码的A C API。

NumPy之于数值计算特别重要的原因之⼀,是因为它可以⾼效 处理⼤数组的数据。这是因为:

NumPy是在⼀个连续的内存块中存储数据,独⽴于其他 Python内置对象。NumPy的C语言编写的算法库可以操作内存,而不必进⾏类型检查或其它前期⼯作。比起Python的内置序列,NumPy数组使用的内存更少。
NumPy可以在整个数组上执⾏复杂的计算,而不需要Python 的for循环。

4.1 NumPy的ndarray:⼀种多维数组对象

NumPy最重要的⼀个特点就是其N维数组对象(即ndarray),该对象是⼀个快速而灵活的大数据集容器。ndarray是⼀个通用的同构数据多维容器,其中的所有元素必须是相同类型的。每个数组都有⼀个shape(⼀个表示各维度大小的元组)和⼀个dtype(⼀个⽤于说明数组数据类型的对象)。以下是一些数组创建函数:
第4章 NumPy基础:数组和矢量计算_第1张图片

生成一个ndarray

import numpy as np
np.arange(5)
#输出
array([0, 1, 2, 3, 4])

NumPy数组的运算:数组很重要,因为它使你不⽤编写循环即可对数据执⾏批量运算。NumPy用户称其为矢量化(vectorization)。
基本的索引和切⽚
切片索引:⼀次传⼊多个切⽚,就像传⼊多个索引那样:
arr[:2,1:],前面的是行索引,后面的是列索引

import numpy as np
array1=[1,3,4],[4,5,6],[7,8,9]
arr=np.array(array1)
# 取前两行后再取第二行  输出array([[4, 5, 6]])
arr[:2][1:]
#⼆维数组切⽚,取前两行后再取后两列,输出array([[3, 4],[5, 6]])
arr[:2,1:]

通过将整数索引和切片混合,可以得到低维度的切片是对某行或某列做切片。如下得到第三行后两个数,输出array([8, 9])

#一个数字索引和切片的混合
arr[2,1:]

布尔型索引:布尔值组成的数组,布尔型数组可⽤于数组索引,长度必须跟被索引的轴长度⼀致,布尔型数组跟切片、整数混合使用,布尔索引的逻辑运算可运作数据清洗,常对目标数据的某行做操作。
花式索引:⽆论数组是多少维的,花式索引总是⼀维的,花式索引跟切⽚不⼀样,它总是将数据复制到新数组中,花式索引返回的是指定目标数组行/列的值,是由他们组成的一维数组。
数组转置和轴对换:简单的转置可以使⽤arr.T。对于高维数组,transpose需要得到⼀个由轴编号组成的元组才能对这些轴进⾏转置(⽐较费脑⼦):

  • List item

4.2 通用函数:快速的元素级数组函数

通⽤函数(即ufunc)是⼀种对ndarray中的数据执⾏元素级运算
的函数。你可以将其看做简单函数(接受⼀个或多个标量值,并
产⽣⼀个或多个标量值)的⽮量化包装器。
第4章 NumPy基础:数组和矢量计算_第2张图片
第4章 NumPy基础:数组和矢量计算_第3张图片
二元函数
第4章 NumPy基础:数组和矢量计算_第4张图片

4.3 利用数组进行数据处理

NumPy数组使你可以将许多种数据处理任务表述为简洁的数组表达式(否则需要编写循环)。⽤数组表达式代替循环的做法,通常被称为矢量化。
将条件逻辑表述为数组运算
numpy.where函数是三元表达式x if condition else y的矢量化版本。举例如下:

result =np.where(cond,xarr,yarr)
#如果cond为true,则xarr,否则为yarr

数学和统计方法
全部的基本数组统计⽅法。后续章节中有很多例⼦都会⽤到这些⽅法。
第4章 NumPy基础:数组和矢量计算_第5张图片
唯⼀化以及其它的集合逻辑
第4章 NumPy基础:数组和矢量计算_第6张图片

4.4 用于数组的文件输⼊输出****

4.5 线性代数

第4章 NumPy基础:数组和矢量计算_第7张图片

4.6 伪随机数生成

numpy.random模块对Python内置的random进⾏了补充,增加了⼀些⽤于⾼效⽣成多种概率分布的样本值的函数。
第4章 NumPy基础:数组和矢量计算_第8张图片

4.7 示例:随机漫步

下⾯是⼀个通过内置的random模块以纯Python的⽅式(for循环)实现1000步的随机漫步:```

import random
import matplotlib.pyplot as plt
position=0
walk=[position]
steps =1000
for i in range (steps):
    step = 1 if random.randint(0,1) else -1  #result =np.where(cond,xarr,yarr)有点像?
    position +=step
    walk.append(position)
plt.plot(walk[:100])

第4章 NumPy基础:数组和矢量计算_第9张图片
从以上代码分析其实就是累计和,也可以使用数组统计方法,运用Numpy中的累计和cumsum()函数来实现,属于高阶实现,

import random 
import numpy as np
import matplotlib.pyplot as plt
nsteps=1000
draws=np.random.randint(0,2,size=nsteps) 
steps=np.where(draws>0,1,-1)   #np.where(cond,xarr,yarr)替代了for循环
walk=steps.cumsum()
plt.plot(walk[:100])

你可能感兴趣的:(数据分析,数据分析)