zoukankan      html  css  js  c++  java
  • python科学计算_numpy_线性代数/掩码数组/内存映射数组

    1. 线性代数

    numpy对于多维数组的运算在默认情况下并不使用矩阵运算,进行矩阵运算可以通过matrix对象或者矩阵函数来进行;

    matrix对象由matrix类创建,其四则运算都默认采用矩阵运算,和matlab十>分相似:

    a = np.matrix([[1,2,3],[4,5,6],[7,8,9]])

    matrix([[1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]])

    a * a

    matrix([[ 30, 36, 42],
    [ 66, 81, 96],
    [102, 126, 150]])

    a + a

    matrix([[ 2, 4, 6],
    [ 8, 10, 12],
    [14, 16, 18]])

    a ** -1

    matrix([[ -4.50359963e+15, 9.00719925e+15, -4.50359963e+15],
    [ 9.00719925e+15, -1.80143985e+16, 9.00719925e+15],
    [ -4.50359963e+15, 9.00719925e+15, -4.50359963e+15]])

    由于numpy中已经有ndarray,再用matrix比较容易弄混;

    矩阵乘积运算:

    对于ndarray对象,numpy提供多种矩阵乘积运算:dot()、inner()、outer()

    dot():对于两个一维数组,计算的是这两个数组对应下标元素的乘积和,即:内积;对于二维数组,计算的是两个数组的矩阵乘积;对于多维数组,结>果数组中的每个元素都是:数组a最后一维上的所有元素与数组b倒数第二维>上的所有元素的乘积和:

    dot(a,b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])

    结果数组c,可以看做是数组a和b的多个子矩阵的乘积;

    inner():对于一维数组,计算的是这两个数组的内积;对于多维数组,计算的结果数组中的每个元素是:数组a和b最后一维的内积,因此a和b的最后一>维长度必须相同:

    inner(a,b)[i,j,k,m] = sum(a[i,j,:]*b[k,m,:])

    outer():如果传入参数数组是多维数组,则先将此数组展平为一位数组,然后再进行计算,得到两个一维数组的外积:

    outer([1,2,3],[4,5,6,7])

    array([[ 4, 5, 6, 7],
    [ 8, 10, 12, 14],
    [12, 15, 18, 21]])

    解线性方程组

    对矩阵更加高级的运算在numpy的linalg模块中可以找到:

    np.linalg.solve()传入两个参数数组,a为N*N的二维数组,b为长度为N的一维数组,满足 : a * x = b,解得x矩阵即是N元一次方程的解;

    np.linalg.lstsq()传入的参数数组不要求a数组为正方形,方程的个数可以>少于未知数的个数,lstsq()计算得到的结果是使得| b - a * x |最小的一>组解,这组解称为最小二乘解,使得所有等式的误差的平方和最小。

    2. 掩码数组

    numpy.ma模块中提供掩码数组的处理,这个模块中几乎完整复制了numpy中的所有函数,并提供掩码数组的功能;

    一个掩码数组由一个正常数组和一个布尔数组组成,布尔数组中值为True的>元素表示正常数组中对应下标的值无效,False表示有效;

    创建掩码数组:

    创建掩码数组:

    import numpy.ma as ma
    x = np.array([1,2,3,5,7,4,3,2,8,0])
    mask = x < 5
    mx = ma.array(x,mask=mask)

    mask

    array([ True, True, True, False, False, True, True, True, False, True], dtype=bool)

    mx

    masked_array(data = [-- -- -- 5 7 -- -- -- 8 --],
    mask = [ True True True False False True True True False True],
    fill_value = 999999)

    掩码数组具有三个属性:data、mask、fill_value;data表示原始数值数组>,mask表示获得掩码用的布尔数组,fill_value表示的填充值替代无效值之>后的数组,该数组通过filled()方法查看;

    掩码数组可以使用各种下标对象对其进行存取,在被掩码的部分值为masked>,可以设置某个位置值为ma.masked使其失效;

    3. 文件存取

    numpy中提供多种存取数组内容的文件操作函数,保存的数组数据可以是二进制格式或者文本格式,二进制格式可以是无格式二进制和numpy专用的格式化二进制类型;
    tofile()方法将数组数据写到无格式二进制文件中,tofile()输出的数据不>保存数组的形状和元素类型等信息;fromfile()函数可以读取无格式二进制>文件,此时,需要正确设置数组的元素类型dtype, 以及后续进行正确的形>状转换操作;如果指定了sep参数,则tofile()、fromfile()将以文本格式进行输入输出,sep指定文本的分隔符;
    load()、save()将数组数据保存为numpy专用的二进制文件中,会自动处理元素类型和形状等信息;如果一次性保存多个数组,则可以使用savez(),savez()函数的第一个参数是文件名,其后的参数都是需要保存的数组,也可以使用关键字参数为数组起名字,非关键字参数数组则会自动命名为arr_0、arr_1、…等,savez()输出的是一个扩展名为npz的压缩文件,其中每个文件都是>一个用save()保存的npy文件,文件名和数组名相同。load()会自动识别npz>文件,并且返回类似字典的对象,通过数组名为键,可以提取其中的数组;
    savetxt()、loadtxt()函数可以读写保存一维而二维数组的文本文件,输出>为间隔符分开的文本,通过delimiter参数指定间隔符;默认输出的格式为'%.18e',默认以空格分隔。

    4. 内存映射数组

    通过memmap()创建内存映射数组,该数组从文件中读取指定偏移量的数据,>而不会把整个文件读入到内存中;可传入参数:

    filename:数组文件

    dtype:[uint8],元素类型

    mode:[r+],读取模式

    offset:[0],偏移量

    shape:读取的形状

    order:[C],元素排列格式,默认为C语言格式,F为Fortran格式;

  • 相关阅读:
    Treap 树堆 容易实现的平衡树
    (转)Maven实战(二)构建简单Maven项目
    (转)Maven实战(一)安装与配置
    根据请求头跳转判断Android&iOS
    (转)苹果消息推送服务器 php 证书生成
    (转)How to renew your Apple Push Notification Push SSL Certificate
    (转)How to build an Apple Push Notification provider server (tutorial)
    (转)pem, cer, p12 and the pains of iOS Push Notifications encryption
    (转)Apple Push Notification Services in iOS 6 Tutorial: Part 2/2
    (转)Apple Push Notification Services in iOS 6 Tutorial: Part 1/2
  • 原文地址:https://www.cnblogs.com/lyon2014/p/4740828.html
Copyright © 2011-2022 走看看