NumPy基础:数组和矢量计算

摘自Wes McKinney著 唐学韬 等译的《利用Python进行数据分析》
NumPy(Numerical Python)是高性能科学计算和数据分析的基础包。
部分功能如下:
1.ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。
2.用于对整组数据进行快速运算的标准数学函数(无需编写循环)。
3.用于读写磁盘数据的工具以及用于操作内存映射文件的工具。
4.线性代数、随机数生成以及傅里叶变换功能。
5.用于集成由C、C++、Fortan等语言编写的代码的工具----这也使得Python成为一种包装C/C++/Fortan历史代码库的选择,并使被包装库拥有一个动态的、易用的接口。

NumPy的ndarray:一种多维数组对象
作为NumPy最重要的一个特点,该对象是一个快速而灵活的大数据集容器。

创建ndarray
1.ndarray:接受一切序列型的对象(包括其他数组),然后产生一个新的含有传入数据的NumPy数组。例子如下:

#这个引入写法是约定俗成
import numpy as np
data1 = [6,7.5,8,0,1]
arr1 = np.ndarray(data1)
arrr1
array([6.,7.5,8.,0.,1.])
arr1.dtype
dtype('float64')

除此之外还有zeros和ones分别可以创建指定长度或形状的全0或全1数组。
empty可以创建一个没有任何具体值的数组,但是不是全0数组,返回的是一些未初始化的垃圾值。
np.zeros(10) 返回的是一维数组,里面10个元素全为0;
np.zeros(3,6) 返回的是3行6列的二维全0数组

arange是Python内置函数range的数组版
np.arange(15)
array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14])

数组创建函数
array
将输入数据(列表、元组、数组或其他序列类型)转换为ndarray。要么推断出dtype,要么显式指定dtype。默认直接复制输入数据
asarray
将输入转换为ndarray,如果输入本身就是一个ndarray就不进行复制
arange
类似内置的range,但是返回的是一个ndarray而不是列表
ones、ones_like
根据指定的形状和dtype创建一个全1数组。ones_like以另一个数组为参数,并根据其形状和dtype创建全1数组
zeros、zeros_like
类似于ones和ones_like,只不过产生的是全0数组而已
empty、empty_like
创建新数组,只分配内存空间但不填充任何值
eye、identity
创建一个正方的N * N单位矩阵(对角线为1,其余为0)

ndarray的数据类型
只需要知道你处理的数据的大致类型是浮点数、复数、整数、布尔值、字符串、还是普通的Python对象即可。
当你需要控制数据在内存和磁盘中的存储方式时(尤其是对大数据集),就得了解如何控制存储类型。
可以通过ndarray的astype来显式地转换其dtype
arr = np.array([1,2,3,4,5])
arr.dtype
dtype(‘int64’)
arr.astype(np.float64).dtype
dtype(‘float64’)
如果是浮点数转换为整数的话,直接就把小数部分去掉
注意
调用astype无论如何都会创建出一个新的数组(原始数据的一份拷贝),即使新dtype跟老dtype相同也是如此。
数组和标量之间的运算
数组很重要,因为它使你不用编写循环即可对数据执行批量运算。这通常叫做矢量化(vectorization)。大小相等的数组之间的任何算术运算都会将运算应用到元素级。
不同大小的数组之间的运算叫做广播。
基本的索引和切片
当你将一个标量值赋值给一个切片时,该值会自动传播到整个选区。跟列表最重要的区别在于,数组切片数原始的视图。这意味着数据不会复制,视图上的任何修改都会直接反映到源数组上
警告
如果你想要得到的是ndarray切片的一份副本而非视图,就需要显式地继续复制操作,例如:arr[5:8].copy()
arr[0,2]等价于arr[0][2]
切片索引
ndarray的切片语法跟Python列表这样的一维对象差不多
data [ names == ‘Aob’ ]
#对names进行索引,找出元素Aob的索引位置,然后根据索引寻找data的对应元素
既可以使用!=,也可以使用-()对条件进行否定
data [ names! = ‘Aob’]、data[ - ( names == ‘Aob’ ) ]
组合多个布尔条件:使用和&、或|,这里不承认and和or

花式索引(Fancy indexing)
arr = np.arange(32).reshape((8,4))
arr[[1,5,7,2],[0,3,1,2]]
选出的元素是(1,0)、(5,3)、(7,1)、(2,2)
array([4,23,29,10])
arr[[1,5,7,2]][:,[0,3,1,2]]
取得四行元素,然后按照0,3,1,2的顺序重新排列
花式索引跟切片不一样,总是将数据复制到新数组中

数组置换和轴对换
arr = np.arange(16).reshape((2,2,4))
arr.transpose((1,0,2))#这里使用单括号与双括号效果一样
得到的数组将是第二行与第三行进行交换,原来的每个元素的索引为(0,1,2),后面变成了(1,0,2)所以是前面两个索引进行调换,原来的4(0,1,0)变成8(1,0,0)
简单的转置可以使用.T,进行轴对换;
此外还有一个swapaxes:将数组n个维度中两个维度进行调换,不改变原数组
arr = np.arange(24).reshape(2,3,4)
arr.swapaxes(1,2)#这里就是将(2,3,4)改变为(2,4,3)

通用函数
abs、fabs
计算整数、浮点数或复数的绝对值。对于非复数,可以使用更快的fabs
sqrt
计算各元素的平方根,相当于arr0.5
square
计算个元素的平方,相当于arr
2
exp
计算各元素的指数e^
log、log10、log2、log1p
分别为自然对数(底数为e)、底数为10的log、底数为2的log、log(1+x)
sign
计算各元素的正负号:1(正数)、0(零)、-1(负数)
ceil
计算各个元素的ceiling值,即大于等于该值的最小整数
floor
计算各个元素的floor值,即小于等于该值的最大整数
rint
将各元素值四舍五入到最接近的正数,保留dtype

利用数组进行数据处理
用数组表达式代替循环的做法,通常被称为矢量化,而广播是一种针对矢量化计算的强大手段。
numpy.where函数是三元表达式 x if condition else y的矢量化版本。
np.where(condition,x,y)
条件满足执行x,不满足执行y。x、y可以是数组,也可以是标量值
np.where(cond1 & cond2,0,np.where(cond1,1, np.where(cond2,2,3)))

数学和统计方法
sum
对数组中全部或某轴向的元素求和。零长度的数组的sum为0
mean
算术平均数。零长度的数组的mean为NaN
std、var
标准差和方差,自由度可调(默认为n)
min、max
最小值、最大值
argmin、argmax
最值的索引
cumsum、cumprod
元素的累和、累积

用于布尔型数组的方法
sum用来统计其中True的个数:(arr>0).sum()
any用于测试数组中是否存在一个或多个True
all用于测试数组中是否均为True
any、all返回的都是布尔值

排序
可以通过sort方法进行就地排序
np.sort返回的是数组的已排序副本,而就低排序则会修改数组本身

数组的集合运算
unique(x)
确认数组x中的唯一元素,并返回有序结果
intersect1d(x,y)
计算数组x和y中的公共元素,并返回有序结果
union1d(x,y)
计算数组x和y的并集,返回有序结果
in1d(x,y)
得到一个’x的元素是否包含于y’的布尔型数组
setdiff1d(x,y)
集合的差,元素只在x中
setor1d(x,y)
集合的对称差,仅在一个集合中的所有元素

用于数组的文件输入输出
对于二进制文件:np.save、np.load
对于文本文件:np.loadtxt、np.getfromtxt、np.savetxt

线性代数
dot函数:矩阵算法
随机数生成

2019-08-22

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值