《利用python进行数据分析》学习笔记(二)--NumPy(1)

由于刚开始接触python的数据分析,第二章引言和第三章IPython就先略读了下,对能做的事和开发环境有了个大致的认识,但针对其中提到的一些优势还有没体会,回头再重新看。今天直接学习python数据分析中重要的库之一:
Numpy(numerical python)

看看它在pypi上的说明(理解不一定准确,希望有大神能够指点,还需要多刷文档):

NumPy: array processing for numbers, strings, records, and objects.

NumPy is a general-purpose array-processing package designed to efficiently
manipulate large multi-dimensional arrays of arbitrary records without
sacrificing too much speed for small multi-dimensional arrays. NumPy is built
on the Numeric code base and adds features introduced by numarray as well as
an extended C-API and the ability to create arrays of arbitrary type which
also makes NumPy suitable for interfacing with general-purpose data-base
applications.

There are also basic facilities for discrete fourier transform, basic linear
algebra and random number generation.

  1. 这里来看是以数组的形式处理数、字符串、记录、对象。

  2. 它能够高效的处理大数量级的多维的数组

  3. 引入C-API,适配低级语言的外部库

  4. 能够进行傅里叶变换、线性代数、随机数生成

学习中Numpy使用之前均需要引入库:import numpy as np,一般不要用引入库里面所有的东西的方式 from numpy import
*,太费。

先来看看ndarray(多维数组对象):

  1. 这个东西是什么? 我理解这个东西就是一个盒子,这个盒子可以装数、字符串等东西,但是每个盒子只能装一种特定类型(也就是同构)的东西。这个盒子有两个重要的属性一个是大小形状(shape)一个是类型(dtype)。

  2. 怎么在python中创建这个东西? 答案是array()函数了:

array 函数:接收序列—>变成数组

import numpy as np
data1=[1,2,3,4,5]
array1=np.array(data1)
array1
array([1, 2, 3, 4, 5])

data2=[[1,2,3,4,5],[6,7,8,9,10]]
array2=np.array(data2)
array2
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])

两个属性 :shape 和
dtype,聪明的array在你没有定义的时候会根据所传入的序列类型自动分配,当然也可以在创建的时候显示的定义dtype。例如arr=np.array([1,2,3],dtype=np.float64

怎么改变这两个属性呢? 对shape来说:一是给shape属性赋值,通过赋值方式改变shape只是改变了轴的大小, 不改变内存地址
。二是通过reshape函数创建一个新尺寸的数组, 引用同一段内存地址
。也就是说改变大小调整后数组的值会影响原值。同样的可以使用属性直接赋值和astype()函数改变类型:

array1.shape
(5,)

array2.shape
(2, 5)

array2.dtype
dtype(‘int32’)

array2.shape=(5,2)
array2
array([[ 1, 2],
[ 3, 4],
[ 5, 6],
[ 7, 8],
[ 9, 10]])

arr2_re=array2.reshape(2,5)
arr2_re
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])

float_arr2=array2.astype(np.float)
float_arr2
array([[ 1., 2.],
[ 3., 4.],
[ 5., 6.],
[ 7., 8.],
[ 9., 10.]])

array2.dtype=np.float
array2.dtype
dtype(‘float64’)

3.这个东西能用来干什么?

首当其冲就是运算: 数据分析当然涉及到运算,数组提供了最重要的功能就是 不用循环就可以对整个数组进行批量运算,这也叫作矢量化
。大小相同的数组运算都会应用到元素级,不同大小数组间的运算叫广播。怎么理解呢?

大小相同的比较好理解:

12+12=24
343468
56561012

大小不相同的这个就是广播,书上广播的原则是这样写的:
如果两个数组的后缘维度(从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为是广播兼容的。广播会在确实和长度为1的维度上进行。

有点绕,上图来看看,先看二维就是MN、M1、1N、11(标量)的矩阵进行运算,会在维度为1的那个轴上延生补齐到大小相等,然后再做计算。更高维度的应该也是同理。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OL7ioirI-1624934436750)()] ![](https://img-
blog.csdn.net/20160303143818104?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)

其次是索引和切片:实现你怎么从这个盒子里面找到、拿到你想要的东西

基本的索引和切片:

索引和切片python中列表类似,总结下是“从零开始,不含末位”,也就是说角标从0开始算,切片不含最后一个数。扩展到多维也是一样,加入轴的概念,在每个轴上面都是一个一维的索引。

这里的切片值得注意的是,切片返回的是原始数组的一个视图,对这个视图的操作会影响到原始数组。(这是因为Numpy设计的目的是为了处理大数据的,如果所有东西都复制对性能和内存影响很大)可以用一个copy()函数来创建一个副本。

直接盗书上的图了:

![](https://img-
blog.csdn.net/20160303104452356?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)

** 布尔型索引: **

顾名思义就是根据真假来选取数据,书上是要求布尔型数组(也可是多维)的长度和被索引的轴长度一致(但亲测bool数组的长度大于被索引轴的长度,如果大于的部分全为False也不会报错,可能是识别False就直接不做操作了,如果小于的话默认其余部分是False)。布尔型索引还是很有用的,提供一种可以根据你设定的条件来找到你想要的值的方法。
注意的是和普通切片不一样,通过布尔型索引选取的数组中的数据总是会创建数据的副本。书上这个例子我觉得特别好,在今后应该也很实用:

data=np.random.randn(7,4)

data

array([[ 1.24638645, 0.25086883, -0.2458813 , -0.4757452 ],

[ 0.34742951, -1.1063471 , 0.48168317, 1.66391008],

[-0.05398018, -0.41111433, -0.10418458, 1.32739541],

[ 1.60864642, 0.32430908, 0.0909067 , -0.54537242],

[-1.52137988, -1.28709502, -2.91485869, 0.59095962],

[ 0.45925604, -1.46305275, -3.12488725, -0.82076166],

[-0.18340406, 0.53307458, 0.52919595, -0.28668082]])

data[data<0]=0

data

array([[ 1.24638645, 0.25086883, 0. , 0. ],

[ 0.34742951, 0. , 0.48168317, 1.66391008],

[ 0. , 0. , 0. , 1.32739541],

[ 1.60864642, 0.32430908, 0.0909067 , 0. ],

[ 0. , 0. , 0. , 0.59095962],

[ 0.45925604, 0. , 0. , 0. ],

[ 0. , 0.53307458, 0.52919595, 0. ]])

data[data>0]=1

data

array([[ 1., 1., 0., 0.],

[ 1., 0., 1., 1.],

[ 0., 0., 0., 1.],

[ 1., 1., 1., 0.],

[ 0., 0., 0., 1.],

[ 1., 0., 0., 0.],

[ 0., 1., 1., 0.]])

这样就把一个随机数组中大于0的数全部变为1,小于0的数变成0了。

** 花式索引: ** 利用整数数组进行索引,以特定的顺序选取子行。

接着上个例子的data数组:

data[[1,3,5]]

array([[ 1., 0., 1., 1.],

[ 1., 1., 1., 0.],

[ 1., 0., 0., 0.]])

但是如果直接多维数组索引,将会索引到元素,如例中得到的就是(1,1)和(3,3,)两个元素。

data

array([[ 1., 1., 0., 0.],

[ 1., 0., 1., 1.],

[ 0., 0., 0., 1.],

[ 1., 1., 1., 0.],

[ 0., 0., 0., 1.],

[ 1., 0., 0., 0.],

[ 0., 1., 1., 0.]])

data[[1,3],[1,3]]

array([ 0., 0.])

如果想要选出的是矩形区域,有两种方法,一种是data[[1,3]][:,[1,3]],相当于先在轴0做一次索引,然后再在轴1做一次索引。另一种是用np.ix_函数将两个一维数组转化成选取矩形的索引器:data[np.ix_([1,3],[1,3])]。

data[[1,3]][:,[1,3]]

array([[ 0., 1.],

[ 1., 0.]])

data[np.ix_([1,3],[1,3])]

array([[ 0., 1.],

[ 1., 0.]])

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值