科学计算基础软件包Numpy学习 01

前言

NumPy是python科学计算的基础软件包,提供了多维数组类及其派生类,和python中列表相比,Numpy在速度上拥有明显的优势,底层使用C语言来编写,内置并行运算功能,并且内部解除了GIL,这意味着Numpy在运行速度和并行计算方面有这先天优势。

安装

Numpy安装非常简单,可以使用pip命令直接安装,安装是可以使用==选择版本号,使用-i参数选择下载速度更改的镜像源。

pip install numpy

导入Numpy是写成import numpy as np 是程序员约定俗称的规则

>>> import numpy as np

列表VS数组

python的列表操作非常灵活,特别是引入负数索引后,更是为列表操作注入了“神奇的力量”,每一个位程序员第一次使用python列表时,都会被它的便捷所打动。
首先,python列表的元素类型不受限制,同一个列表内,列表元素可以是不同的数据类型,甚至可以是函数。
其次,python列表元素可以动态增删,可以通过append()方法向列表末尾增加元素,insert()在指定位置插入元素,pop()删除指定索引的元素,remove()可以删除指定的元素。
最后,python列表的索引非常简单,灵活,高效,[-1]可以取得最末尾的元素,[1:-1]可以返回“掐头去尾”后的列表,[::-1]可以反转列表,[::2]可以隔开一个取一个元素。
Numpy数组的操作更加便捷,比python列表更是有过之而不及,并且还提供了大量的函数,但是同时也增加了限制:一是数组元素必须具有相同的数据结构;二是数据一旦创建,其元素数量就不能在改变了。
说到这里,你也许会问:既然Numpy数组有这些限制条件,那我们为啥还要使用它呢?答案是,Numpy数据具有极高的,接近C语言的运行的效率,同时又继承了python列表操作便捷,灵活的特点,可以说Numpy数组是专为处理科学数据而生的。

数组的数据类型

Numpy支持的数据类型主要有整型,浮点型,布尔型和复数型,每一个种数据类型根据占用内存的字节数又分为多个不同的子类型。
整型:np.int8,np.int16,np.int32,np.int64
无符号整型:np.uint8,np.uint16,np.uint32,np.uint64
浮点型:np.float16,np.float32,np.float64
布尔型:np.bool
复数型:np.complex64,np.complex128
注意:在创建数组的时,如果不指定数据类型,Numpy会根据输入的参数自动选择合适的数据类型,通常在指定数组类型的时候,可以省略类型后面的数字,如果省略数字,整型和无符号整型默认是32位,浮点型默认是64位,复数型默认是128位。

数组的属性

属性说明
ndarray.dtype数组的数据类型
ndarray.shape数组的结构,也可以理解为数组的形状
ndarray.size数组的元素格式
ndarray.itemsize每个元素占用内存的大小,以字节为单位
ndarray.ndim数组的维度数,也叫秩
ndarray.flags数组的内存信息
ndarray.real数组实部
ndarray.imag数组虚部
ndarray.data数组在内存中实际存储区域的起始地址

数组的方法

在python基础语法中,我们介绍列表对象有追加,插入等多种方法,相比之下,数组的操作方法更多,目前我们只需要记住两个方法就行:ndarray.astype()和ndarray.reshape().前者可以修改元素类型,后者可以重新定义数组的结构,这两个方法的重要性和其对应的属性一样,记住ndarray.dtype和ndarray.shape这两个属性及其对应的修改数据类型和数组结构两个方法,有助于在调试代码是快速定位问题。

>>> a = np.arange(6)
>>> a
array([0, 1, 2, 3, 4, 5])
>>> a.shape
(6,)
>>> a.dtype
dtype('int32')
>>> a = a.reshape((2,3)) #改变数组结构
>>> a
array([[0,1,2],
       [3,4,5]])
>>> a = a.astype(np.float)  #改变数据类型
>>> a.dtype
dtype('float64')

广播和矢量化

Numpy数据具有极高的,接近C语言的运行效率,处理速度远比python列表快得多,Numpy拥有区别于列表的两大“独门绝技”:广播和矢量化。广播可以理解为隐式地对每个元素实施操作;矢量化可以理解为代码中没有显示的循环,索引等。可能有点抽象,下面举例来说明一下

例一 数值型数组的各个元素加1

使用python列表实现如下:

>>> a = [0, 1, 2, 3, 4]
>>> for i in range(len(a)):
        a[i] += 1
>>> a
[1, 2, 3, 4, 5]

使用Numpy数组实现如下:

>>> a = np.array([0, 1, 2, 3, 4])
>>> a += 1
>>> a
array([1, 2, 3, 4, 5])
例二 两个等长的数值型数组的对应元素相加

使用python中zip()函数实现如下:

>>> a = [0, 1, 2, 3, 4]
>>> b = [5, 6, 7, 8, 9]
>>> [i+j for i, j in zip(a,b)]
[5, 7, 9, 11, 13]

使用numpy数组进行操作如下:

>>> a = np.array([0, 1, 2, 3, 4])
>>> b = np.array([5, 6, 7, 8, 9])
>>> a + b
array([5, 7, 9, 11, 13])

上面的两个例子分别用列表和数组的方式给出了答案。显然用Numpy数组实现起来要比用python列表更直观,更简洁。这真是得益于Numpy的两大特性:广播和矢量化。

参考书籍<<Python高手修炼之道数据处理与机器学习实战>>

生活不可能像你想象得那么好,但也不会像你想象得那么糟。我觉得人的脆弱和坚强都超乎自己的想象。有时,我可能脆弱得一句话就泪流满面;有时,也发现自己咬着牙走了很长的路。 -----莫泊桑

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值