NumPy科学计算库学习记录

  Python语言最为流行的科学计算库。主要是在数学计算的时候,使用矩阵的方式可以加速纯粹循环方式计算的速度。而SciPy则是建立在Numpy上的一个库,增加了数值分析、统计等一些函数算法。

一、Numpy基础

数组对象(由实际的数据和描述这些数据的元数据组成)

  • 产生向量:

    1
    >>> a = numpy.arange(12)
  • 向量加法:

    1
    2
    3
    >>> b = 3; # broadcast
    >>> d = numpy,arange(12) ** 2 # 指数
    >>> c = a + b; e = a + d;
  • 多维数组:

    1
    2
    3
    >>> m = numpy.array([ numpy.arange(3), numpy.arange(3) ** 2])
    >>> m.shape # (2, 3)
    >>> m[1,2] # 4
  • Numpy支持的数据类型
    bool(True/False) inti int8 int16 int32 int64 uint8 uint16 uint32 uint64 float16 float32 float complex64 complex

    1
    >>> numpy.arange(3, dtype=float)
  • 自定义数据类型

    1
    2
    3
    4
    >>> t = numpy.dtype([('name', numpy.str, 20),('age', numpy.int32),('height', numpy.float)])
    >>> t
    dtype([('name', '<U20'), ('age', '<i4'), ('height', '<f8')])
    >>> items = numpy.array([('taozhijiang',29, 168),('YAO', 28, 158.999)])
  • 数组的切片(同Python本身类似)

    1
    2
    3
    >>> a = numpy.arange(9) # array([0, 1, 2, 3, 4, 5, 6, 7, 8])
    >>> a[:7:2] # array([0, 2, 4, 6])
    >>> a[::-2] # array([8, 6, 4, 2, 0]) #反向序列
  • 多维数组的切片

    1
    2
    3
    4
    >>> b = numpy.arange(24).reshape(2,3,4)  
    >>> b[0,2,2] # 10
    >>> b[1,1,:] # array([16, 17, 18, 19])
    >>> b[1,1,::2] # array([16, 18])
  • 修改数组的维度

    1
    2
    3
    4
    5
    >>> b = numpy.arange(24).reshape(2,3,4)
    >>> b.ravel() # 展开一维数组
    >>> b.flatten() # 同上面,只是上面得到的是原来数据的View,而下面会重新分配内存存储数据。例如你在View中修改某一个数据,那么b本身也会被修改掉。
    >>> b.transpose() # 矩阵的转置
    >>> b.resize(3,8) # reshape函数返回一个新数组,但原数组本身不变;resize在返回一个新数组的同时也改变原数组本身。
  • 组合数组

    1
    2
    3
    4
    5
    >>> numpy.hstack((a,b)) # 矩阵的水平组合
    >>> numpy.concatenate((a,b), axis=1) # 效果同上
    >>> numpy.vstack((a,b)) # 垂直组合
    >>> numpy.concatenate((a,b), axis=0)
    >>> numpy.dstack((a,b)) # 深度组合
  • 分割数组

    1
    2
    3
    4
    5
    >>> a = numpy.arange(9).reshape(3,3)
    >>> numpy.hsplit(a, 3)
    >>> numpy.split(a, 3, axis=1) # 垂直分割
    >>> numpy.vsplit(a, 3)
    >>> numpy.split(a, 3, axis=0) # 水平分割
  • 数组的其它属性

    1
    2
    3
    >>> a.ndim # 维度 2
    >>> a.size # 数据个数 9
    >>> a.T # 转置
  • 类型转换

    1
    2
    >>> a.astype(float)
    >>> a.tolist() # 转换成列表类型

二、Numpy函数

  • 保存和加载数据(常用类型 CSV Comma-Separated Value)

    1
    2
    3
    >>> numpy.savetxt("a.txt", a)
    >>> b = numpy.loadtxt('a.txt').astype(int64)
    >>> c,v = numpy.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True) # unpack用于拆分数据到c,v
  • 各种常用计算

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> vwap = numpy.average(c, weights=v) # 成交量加权的平均价格
    >>> numpy.average(c) # 没有加权,同numpy.mean(c)
    >>> numpy.ptp(c) # 等同于numpy.max(c) - numpy.min(c)
    >>> numpy.median(c) # 中值,如果数目为偶数,那么就是中间相邻两个数的均值
    >>> sorted_close = numpy.msort(c) # 排序
    >>> numpy.var(c) # 方差,等同于计算numpy.mean((c-numpy.mean(c))**2)
    >>> numpy.diff(c) # 后面一个减掉前面一个,结果会比c少一个元素
    >>> returns = numpy.diff(numpy.log(c))
    >>> post = numpy.where(returns >>> 0) # 获取正收益的下标
    (array([ 0, 1, 4, 5, 6, 7, 9, 10, 11, 12, 16, 17, 18, 19, 21, 22, 23, 25, 28]),)
  • 加载日期(Python本身支持的)

    1
    2
    >>> datetime.datetime.strptime(a,'%d-%m-%Y')
    >>> datetime.datetime.strptime(a,'%d-%m-%Y').date()
  • numpy.apply_along_axis 提供函数,然后作用与每一个数组元素上

    1
    2
    3
    4
    >>> def my_func(a):  return (a[0] + a[-1]) * 0.5 
    >>> b = np.array([[1,2,3], [4,5,6], [7,8,9]])
    >>> np.apply_along_axis(my_func, 0, b) # array([ 4., 5., 6.]) # axis同垂直或者竖直方向
    >>> np.apply_along_axis(my_func, 1, b) # array([ 2., 5., 8.])
  • numpy.maximum(x1, x2[, out]) 两个矩阵取最大值

    1
    numpy.maximum(x1, 3) # 也可以Broadcasting
  • 数组的修剪和压缩

    1
    2
    3
    4
    5
    >>> a = numpy.arange(6)
    >>> a.clip(2,4) #设定最大最小值 array([2, 2, 2, 3, 4, 4])
    >>> a.compress( (a%2) ) # 选出满足条件的元素 array([1, 3, 5])
    >>> a = numpy.arange(1,5)
    >>> a.prod() # 24 所有元素之积

(TO BE CONTINUED!)