【3】数据分析-1-数据的处理--numpy--1

Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy、matplotlib一起使用。其实,list已经提供了类似于矩阵的表示形式,不过numpy为我们提供了更多的函数。

  • a powerful N-dimensional array object
  • sophisticated (broadcasting) functions
  • tools for integrating C/C++ and Fortran code
  • useful linear algebra, Fourier transform, and random number capabilities

一、产看np的版本

    >>>import numpy as np
    >>>print np.version.version
    1.8.0rc1

二、基本语法

  • NumPy数组的下标从0开始。
  • 同一个NumPy数组中所有元素的类型必须是相同的。

多维数组的类型是:numpy.ndarray,别名是 array。通常数组里的元素都是数字,Numpy的维度称为axes,通常都是排序的。

例如: [1, 2, 1] 是一个只有一个axis,且长度位3的一维数组。

下面的例子中是一个二维数组,一维的长度2,二维的长度是3。

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

ndarray有几个非常强大的属性:

ndarray.ndim axes的数量,在python的世界里,dimensions跟rank相关。

ndarray.shape 定义每个维度的长度,例如一个列数为n,行数位m的数组,其shape为(n,m),如果是三维的,你可以接着定义,如下面的例子

ndarray.size 多维数组里面元素的个数

ndarray.dtype 多维数组里面元素的数据类型,例如: numpy.int32, numpy.int16, numpy.float64

名称 描述
bool 用一个Bit存储的布尔类型(True或False)
inti 由所在平台决定其大小的整数(一般为int32或int64)
int8 一个字节大小,-128 至 127
int16 整数,-32768 至 32767
int32 整数,-2 ** 31 至 2 ** 32 -1
int64 整数,-2 ** 63 至 2 ** 63 – 1
uint8 无符号整数,0 至 255
uint16 无符号整数,0 至 65535
uint32 无符号整数,0 至 2 ** 32 – 1
uint64 无符号整数,0 至 2 ** 64 – 1
float16 半精度浮点数:16位,正负号1位,指数5位,精度10位
float32 单精度浮点数:32位,正负号1位,指数8位,精度23位
float64或float 双精度浮点数:64位,正负号1位,指数11位,精度52位
complex64 复数,分别用两个32位浮点数表示实部和虚部
complex128或complex 复数,分别用两个64位浮点数表示实部和虚部

ndarray.itemsize ndarray  对象中每个元素的大小,以字节为单位 the size in bytes of each element of the array. For example, an array of elements of type float64 has itemsize 8 (=648), while one of type complex32 has itemsize 4 (=328). It is equivalent to ndarray.dtype.itemsize.

ndarray.data the buffer containing the actual elements of the array. Normally, we won’t need to use this attribute because we will access the elements in an array using indexing facilities.

    >>> from numpy  import *
    >>> a = arange(15).reshape(3, 5)
    >>> a
    array([[ 0,  1,  2,  3,  4],
                 [ 5,  6,  7,  8,  9],
                 [10, 11, 12, 13, 14]])
    >>> a.shape
    (3, 5)
    >>> a.ndim
    2
    >>> a.dtype.name
    'int32'
    >>> a.itemsize
    4
    >>> a.size
    15
    >>> type(a)
    numpy.ndarray
    >>> b = array([6, 7, 8])
    >>> b
    array([6, 7, 8])
    >>> type(b)
    numpy.ndarray

    >>> print np.arange(24).reshape(2,3,4)
    [[[ 0  1  2  3]
        [ 4  5  6  7]
        [ 8  9 10 11]]

     [[12 13 14 15]
        [16 17 18 19]
        [20 21 22 23]]]

2.基本操作

见下一篇博文

3.基本运算

NumPy一元函数

对ndarray中的数据执行元素级运算的函数

np.abs(x) np.fabs(x) 计算数组各元素的绝对值
np.sqrt(x) 计算数组各元素的平方根
np.square(x) 计算数组各元素的平方
np.log(x) np.log10(x) np.log2(x) 计算数组各元素的自然对数、10底对数和2底对数
np.ceil(x) np.floor(x) 计算数组各元素的ceiling值 或 floor值
np.rint(x) 计算数组各元素的四舍五入值
np.modf(x) 将数组各元素的小数和整数部分以两个独立数组形式返回
np.cos(x) np.cosh(x) np.sin(x) np.sinh(x) np.tan(x) np.tanh(x) 计算数组各元素的普通型和双曲型三角函数
np.exp(x) 计算数组各元素的指数值
np.sign(x) 计算数组各元素的符号值,1(+), 0, ‐1(‐)

NumPy二元函数

  • ‐ * / ** 两个数组各元素进行对应运算

np.maximum(x,y) np.fmax() np.minimum(x,y) np.fmin() 元素级的最大值/最小值计

np.mod(x,y) 元素级的模运算

np.copysign(x,y) 将数组y中各元素值的符号赋值给数组x对应元素

> < >= <= == != 算术比较,产生布尔型数组


    >>> a = array( [20,30,40,50] )
    >>> b = arange( 4 )
    >>> b
    array([0, 1, 2, 3])
    >>> c = a-b
    >>> c
    array([20, 29, 38, 47])
    >>> b**2
    array([0, 1, 4, 9])
    >>> 10*sin(a)
    array([ 9.12945251, -9.88031624,  7.4511316 , -2.62374854])
    >>> a

*是元素的相乘,dot才是线性计算

    >>> A = array( [[1,1],
    ...             [0,1]] )
    >>> B = array( [[2,0],
    ...             [3,4]] )
    >>> A*B                         # elementwise product
    array([[2, 0],
                 [0, 4]])
    >>> dot(A,B)                    # matrix product
    array([[5, 4],
                 [3, 4]])

元素的加减

    >>> a = ones((2,3), dtype=int)
    >>> b = random.random((2,3))
    >>> a *= 3
    >>> a
    array([[3, 3, 3],
                 [3, 3, 3]])
    >>> b += a
    >>> b
    array([[ 3.69092703,  3.8324276 ,  3.0114541 ],
                 [ 3.18679111,  3.3039349 ,  3.37600289]])
    >>> a += b                                  # b is converted to integer type
    >>> a
    array([[6, 6, 6],
                 [6, 6, 6]])

不同数据类型的数组运算时,结果的数据类型默认的为更加精确的数据类型

    >>> a = ones(3, dtype=int32)
    >>> b = linspace(0,pi,3)
    >>> b.dtype.name
    'float64'
    >>> c = a+b
    >>> c
    array([ 1.        ,  2.57079633,  4.14159265])
    >>> c.dtype.name
    'float64'
    >>> d = exp(c*1j)
    >>> d
    array([ 0.54030231+0.84147098j, -0.84147098+0.54030231j,
                 -0.54030231-0.84147098j])
    >>> d.dtype.name
    'complex128'

求和是所有元素的和

    >>> a = random.random((2,3))
    >>> a
    array([[ 0.6903007 ,  0.39168346,  0.16524769],
                 [ 0.48819875,  0.77188505,  0.94792155]])
    >>> a.sum()
    3.4552372100521485
    >>> a.min()
    0.16524768654743593
    >>> a.max()
    0.9479215542670073

当然,你也可以指定具体的某一个列或者行的统计

    >>> b = arange(12).reshape(3,4)
    >>> b
    array([[ 0,  1,  2,  3],
                 [ 4,  5,  6,  7],
                 [ 8,  9, 10, 11]])
    >>>
    >>> b.sum(axis=0)                            # sum of each column
    array([12, 15, 18, 21])
    >>>
    >>> b.min(axis=1)                            # min of each row
    array([0, 4, 8])
    >>>
    >>> b.cumsum(axis=1)                         # cumulative sum along each row
    array([[ 0,  1,  3,  6],
                 [ 4,  9, 15, 22],
                 [ 8, 17, 27, 38]])

4.数据的读写

方法一:csv文件

np.savetxt(frame, array, fmt='%.18e', delimiter=None)
frame : 文件、字符串或产生器,可以是.gz或.bz2的压缩文件
array : 存入文件的数组
fmt : 写入文件的格式,例如:%d %.2f %.18e
delimiter : 分割字符串,默认是任何空格

np.loadtxt(frame, dtype=np.float, delimiter=None, unpack=False)
frame : 文件、字符串或产生器,可以是.gz或.bz2的压缩文件
dtype : 数据类型,可选
delimiter : 分割字符串,默认是任何空格
unpack : 如果True,读入属性将分别写入不同变量

CSV只能有效存储一维和二维数组

np.savetxt() np.loadtxt()只能有效存取一维和二维数组

方法二:多维数据的存取

a.tofile(frame, sep='', format='%s')
frame : 文件、字符串
sep : 数据分割字符串,如果是空串,写入文件为二进制
format : 写入数据的格式

a.tofile(frame, sep=‘,‘, format='%s') 形成了一个文本文件(
a.tofile(frame, format='%s') 不指定sep,形成的一个二进制文件

np.fromfile(frame, dtype=float, count=‐1, sep='')
frame : 文件、字符串
dtype : 读取的数据类型
count : 读入元素个数,‐1表示读入整个文件
sep : 数据分割字符串,如果是空串,写入文件为二进制

维度信息会丢失,需要通过reshape来找回维度信息

该方法需要读取时知道存入文件时数组的维度和元素类型 a.tofile()和np.fromfile()需要配合使用 可以通过元数据文件来存储额外信息

方法三:

np.save(fname, array) 或 np.savez(fname, array)

  • fname : 文件名,以.npy为扩展名,压缩扩展名为.npz
  • array : 数组变量

np.load(fname)

  • fname : 文件名,以.npy为扩展名,压缩扩展名为.npz

5.numpy中的随机数

NumPy的random子库

np.random.*
np.random.rand()
np.random.randn()
np.random.randint()

rand(d0,d1,..,dn) 根据d0‐dn创建随机数数组,浮点数,[0,1),均匀分布
randn(d0,d1,..,dn) 根据d0‐dn创建随机数数组,标准正态分布
randint(low[,high,shape] 据shape创建随机整数或整数数组,范围是[low, high)
seed(s) 随机数种子,s是给定的种子值

shuffle(a) 根据数组a的第1轴进行随排列,改变数组x
permutation(a) 根据数组a的第1轴产生一个新的乱序数组,不改变数组x
choice(a[,size,replace,p]) 从一维数组a中以概率p抽取元素,形成size形状新数组 replace表示是否可以重用元素,默认为False

案例:

    >>> a =np.random.randint(100,200,(3,5))
    >>> a
    array([[152, 180, 139, 184, 123],
                 [187, 199, 160, 187, 184],
                 [127, 182, 131, 123, 161]])

uniform(low,high,size)

产生具有均匀分布的数组,low起始值,high结束值,size形状

normal(loc,scale,size)

产生具有正态分布的数组,loc均值,scale标准差,size形状

poisson(lam,size)

产生具有泊松分布的数组,lam随机事件发生率,size形状

6.numpy的统计函数

sum(a, axis=None) 根据给定轴axis计算数组a相关元素之和,axis整数或元组
mean(a, axis=None) 根据给定轴axis计算数组a相关元素的期望,axis整数或元组
average(a,axis=None,weights=None) 根据给定轴axis计算数组a相关元素的加权平均值
std(a, axis=None) 根据给定轴axis计算数组a相关元素的标准差
var(a, axis=None) 根据给定轴axis计算数组a相关元素的方差

min(a) max(a) 计算数组a中元素的最小值、最大值
argmin(a) argmax(a) 计算数组a中元素最小值、最大值的降一维后下标
unravel_index(index, shape) 根据shape将一维下标index转换成多维下标
ptp(a) 计算数组a中元素最大值与最小值的差
median(a) 计算数组a中元素的中位数(中值)

6.numpy的梯度函数

np.gradient(f) 计算数组f中元素的梯度,当f为多维时,返回每个维度梯度 梯度:连续值之间的变化率,即斜率

XY坐标轴连续三个X坐标对应的Y轴值:a, b, c,其中,b的梯度是: (c‐a)/2

六、其他函数

logspace创建等比数列

先来看一个例子,我们让开始点为0,结束点为0,元素个数为10,看看输出结果。为什么是这样子?难道不都是0吗?

    >>> a = np.logspace(0,0,10)
    >>> a
    array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])

因为logspace中,开始点和结束点是10的幂,0代表10的0次方,9代表10的9次方。我们看下面的例子。

    >>> a = np.logspace(0,9,10)
    >>> a
    array([  1.00000000e+00,   1.00000000e+01,   1.00000000e+02,
                     1.00000000e+03,   1.00000000e+04,   1.00000000e+05,
                     1.00000000e+06,   1.00000000e+07,   1.00000000e+08,
                     1.00000000e+09])

    >>> a = np.logspace(0,9,10)
    >>> a
    array([  1.00000000e+00,   1.00000000e+01,   1.00000000e+02,
                     1.00000000e+03,   1.00000000e+04,   1.00000000e+05,
                     1.00000000e+06,   1.00000000e+07,   1.00000000e+08,
                     1.00000000e+09])

假如,我们想要改变基数,不让它以10为底数,我们可以改变base参数,将其设置为2试试。

    >>> a = np.logspace(0,9,10,base=2)
    >>> a
    array([   1.,    2.,    4.,    8.,   16.,   32.,   64.,  128.,  256.,  512.])

更多例子参见:numpy官网

参考资料:

http://www.jb51.net/article/49397.htm

http://wiki.scipy.org/Tentative_NumPy_Tutorial

http://blog.csdn.net/sunny2038/article/details/9002531

http://blog.csdn.net/shenpengjianke/article/details/29356755

北京理工大学 嵩天老师 课件

个人公众号,比较懒,很少更新,可以在上面提问题:

更多精彩,请移步公众号阅读:

Sam avatar
About Sam
专注生物信息 专注转化医学