参考:Wes McKinney 《Python for Dtaa Analysis》
NumPy(Numerical Python的简称),是高性能科学计算和数据分析的基础包。其部分功能如下:
最后一点也是从生态系统角度来看最重要的一点。由于NumPy提供了一个简单易用的C API,因此很容易将数据传递给低级语言编写的外部库,外部库也能以NumPY数组的形式将数据返回给Python。
pip install numpy/NumPy #控制台安装
import numpy as np #导入必须小写,且最好遵守np的惯例
NumPy最重要的一个特点就是其N维度数组对象,即ndarray,该对象是一个快速而灵活的大数据容器。
ndarray是一个通用的同构数据多维容器,也就是说其中的所有元素必须是相同类型。
2.1创建数组(ndarray)
创建数组最简单的方法是使用array(data)函数,传入的参数是一切序列型的对象(包括其他数组),然后产生一个含有传入数据的ndarray。
>>> data1=[1,2,3]
>>> arr1=np.array(data1)
>>> arr1
array([1, 2, 3])
>>> data2=[[1,2,3],[4,5,6]] #嵌套序列
>>> arr2=np.array(data2)
>>> arr2
array([[1, 2, 3],
[4, 5, 6]])
>>> arr3=np.array(arr2)
>>> arr3
array([[1, 2, 3],
[4, 5, 6]])
嵌套序列(如几个等长的列表)将会被转化为一个多维数组,当然即使是不等长的也可以
>>>arr4=np.array([(1,2,3),(4,5)])
>>> arr4
array([(1, 2, 3), (4, 5)], dtype=object)
除此之外,还有一些常用的创建ndarray数组的方式:
需要说明的是,empty函数返回的并非全0而是数组,其内都是一些没有意义未初始化的值,请切记。但是empty是最快的创建数组的方式,这一点需要注意。
2.2ndarray的数据类型
ndarray有一些常用的属性,如:
>>>arr2=array([[1, 2, 3],
[4, 5, 6]])
>>> arr2.ndim
2
>>> arr2.shape
(2, 3)
>>> arr2.dtype
dtype('int64')
注意到有一个属性:dtype,这是ndarray用于存储数据类型的对象。
除非显式说明,np.array会尝试为新建的这个数组推断出一个合适的数据类型,如上面的例子。
具体而言,NumPy的数据类型如下:
类型 | 类型代码 | 说明 |
---|---|---|
int8、uint8 | i1、u1 | 有符号和无符号的8位(1个字节)整型 |
int16、uint16 | i2、u2 | 有符号和无符号的16位(2个字节)整型 |
int32、uint32 | i4、u4 | 有符号和无符号的32位(4个字节)整型 |
int64、uint64 | i8、u8 | 有符号和无符号的64位(8个字节)整型 |
float16 | f2 | 半精度浮点数 |
float32 | f4或f | 标准的单精度浮点数。与C的float兼容 |
float64 | f8或d | 标准的双精度浮点数。与C的double和Python的float对象兼容 |
float128 | f16或g | 扩展精度浮点数 |
complex64 | c8 | 分别用两个64位浮点数标识的复数,其他位数同理 |
bool | ? | 存储True和False值的布尔类型 |
object | O | Python对象类型 |
string_ | S_ | 固定长度的字符串类型(每个字符一个字节),如S10 |
unicode_ | U_ | 固定长度的unicode类型(字节数由平台决定),如U10 |
dtype=
可以+np.类型/’类型代码’/’类型’
如果你确实很懒或者吧不确定数据的确切类型,你也可以直接填入python中的已有数据类型,如dtype=float
。ndarray会自动匹配最接近的数据类型。
对于已有的ndarray数组你可以通过astype函数显式的转换其dtype,如
arr=np.array([1,2,3])
arr=arr.astype(float)
arr
2.3ndarray与标量之间的运算
数组和重要,因为他可以使你不用编写循环就可以对数据进行批量处理,这通常叫做矢量化(vectorization),这点上python与R还是十分相似的。
数组与标量的运算会传播至数组的每个元素
>>>arr1=np.array([[1,2,3],
[4,5,6]])
>>>arr1*3
array([[ 3, 6, 9],
[12, 15, 18]])
大小相等的数组会在对应元素间进行运算
>>>arr2=np.arry([[1,2,3],
[4,5,6]])
>>>arr2-arr1
array([[0, 0, 0],
[0, 0, 0]])
不同大小的数组间的运算叫做广播,这在之后的博文中再做介绍。