numpy学习总结【1】

1.  为什么选择numpy

numpy对于数据分析处理两大特点:1. 速度快,2. 语法简单。

举两个例子:

1)下面是我在jupyter notebook运行的代码,可以发现python的list运算速度跟numpy相差了一个数量级,

结果为何如此,简单理解就是,python list相当于是容器,里面可以存放各种数据类型,而numpy的数组只能存放指定的一类数据类型,如int32、float等,numpy的数组所有值分配到固定的一个空间,跟c是一样的,所以操作起来速度快不少。

2)从下面的很简单例子就可以看出,python的列表操作,不适合我们常规的数据计算。而numpy天生就是为了数据计算而生的,所有操作起来那是相当顺溜,例如例子中两个numpy数据的加减乘除平方等等操作,都是相应项的对应操作。

2. numpy的几个常用属性

dtype : data type, numpy的数据类型,由于numpy数组只能有一种数据类型,其定义时如果不指定dtype,则由系统默认指定,对于整数类型,window默认为int32,对于mac、linux默认为int64。这里需要注意的一点是,下面的例子,numpy的数据类型由所有数据共同决定,固默认是会优先升级类型,但是我们可以通过dtype来指定我们想要的数据类型,这样有些项就会被截断。

ndim: number of dimensions,数据的维度,这个很好理解。

shape: array shape,shape返回的是一个tuple,tuple的每一项为数组每一维的长度。

size:numpy数组的大小,shape tuple的各项相乘。

注意的地方是一维数组的shape形式(4,),由于是tuple,所以是必须带逗号的。numpy的一维数组,默认是行排列的,

不像矩阵操作,因为只有一个维度,我们不能对其进行维度翻转。

itemsize: 每个元素的大小,这个是与我们numpy数组的dtype有关的。

nbytes:返回的是numpy数组占用的内存总字节数。例子中,我们有12个元素,每个元素占4个字节,固总占用48字节。

3. 不要用numpy的矩阵部分,不要用numpy的矩阵部分,不要用numpy的矩阵部分

4. numpy的索引和切片

有两张比较好的说明图片,我直接拷贝过来。

 

上面两张图片对于numpy的切片索引已经表达的特别清晰了,有几点需要额外注意的地方是:

1)numpy多维数组的索引形式与python的list是有差别的。看下面的例子,python是不支持多维写在一起的,而numpy可以,这也是numpy方便的地方,这样表达很清晰。

2)这点需要注意的地方是numpy跟python list一样,每当进行索引就会失去一个维度,而进行切片时这个维度将被保留。看下面的例子,虽然a[0][:]与a[0:1][:],看似能取到的值是一样的,但是两者的维度是不同的,前一个因有索引,所以失去了一个维度。

3) 切片并没有复制元数据,只是指向了所选取的内存区域,所以切片中值改变了,原数据也是会变的。

这一点从下面的例子可以看出,切片的flags.owndata = False.

5. numpy的花式索引(Fancy Indexing)

1)通过位置进行索引。

这种索引的特点是传递的是索引数组,而不是单个标量。例:

2)通过布尔数组进行索引。

这种索引传递进去的是个布尔类型的数组,并且数组的长度必须与待索引的数组长度一致,由于python里面bool类型的0自动转为False,1转为True,这样就可以过滤掉False位置的元素。

3)布尔索引的额外用法

一般我们不会手动定义bool数组,而是按照指定条件来生成bool数组。如下:

如果只是针对一次过滤的情况,我们可以直接简写,如下:

有一点需要额外注意,如果有两个过滤条件,我们是不能直接像下面这样写的,因为python里面and运算符都是针对的单个值,不针对数组进行。如果需要对bool数组整个判断真假就需要any或者all方法。

正确的做法是采用按位操作符&、| 、~、^:

那么花式索引与切片都可以一次取出多个数据,他们之间的区别是什么呢?

划重点:花式索引永远会给出一个副本,而切片永远会给出一个视图。所以花式索引的修改不影响原数据的内容。

4)花式索引在多维数组的应用

很多时候我们要取的数据单靠普通切片是无法实现的,这时候就需要采用花式索引相结合的方式,具体的理解,下面的图片说明的很详细了。注意的是花式索引返回的是一维数组,而不是保持二维,这与索引降维是一致的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值