【Numpy】Numpy 常用操作总结

前言

本文总结了在使用 Numpy 时的一些常用操作,包括矩阵的创建、单矩阵操作、多矩阵操作,以及矩阵的存储和加载。

在以下示例代码中,均已事前导入Numpy:import numpy as np

环境

  • Windows 10
  • Python 3.7.0
  • Numpy 1.18.1

矩阵创建(单位阵、全零、全1矩阵等)

  • 单位阵:np.eye(N, M=None)
    N 指矩阵行数,默认M=N,返回shape=(N, M)的单位阵,主对角线为1。

    >>> np.eye(2, dtype=int)
    array([[1, 0],
           [0, 1]])
    >>> np.eye(3, k=1)
    array([[0.,  1.,  0.],
           [0.,  0.,  1.],
           [0.,  0.,  0.]])
    
  • 全零矩阵:np.zeros(shape)
    shape=(n, m)控制生成n行、m列的矩阵。

    >>> s = (2,2)
    >>> np.zeros(s)
    array([[ 0.,  0.],
           [ 0.,  0.]])
    
  • 全1矩阵:np.ones(shape)

    >>> np.ones(5)
    array([1., 1., 1., 1., 1.])
    >>> s = (2,2)
    >>> np.ones(s)
    array([[1.,  1.],
           [1.,  1.]])
    
  • 转换生成:np.array(p_object)
    p_object 可以指listtube 等形状上类似于array的对象。

    >>> np.array([[1, 2], [3, 4]])
    array([[1, 2], 
    	  [3, 4]])
    >>> np.array(np.mat('1 2; 3 4'))
    array([[1, 2],
          [3, 4]])
    >>> (np.arange(0, 4) - 2).reshape(2, 2)
    array([[-2 -1]
    	 [ 0  1]])
    

单矩阵操作(转置、三角阵、找索引、累计和、均值方差、各种范数等)

  • 转置:arr.Tarr.transpose()

  • 求上/下三角矩阵:arr = np.triu(arr, k=0) / arr = np.tril(arr, k=0)
    其中,k=0 (默认) 表明保留主对角线的元素,k>0 表示保留主对角线之上的全部,k<0 表示保留主对角线之下的全部。

    np.tril([[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15]], -1)
    array([[ 0,  0,  0],
           [ 4,  0,  0],
           [ 7,  8,  0],
           [10, 11, 12],
           [13, 14, 15]])
    
  • 找到特定值的索引:index = np.where(arr == target) target=1 时就是找到全部为1元素的索引。

  • 求累计和:np.cumsum(arr, axis=None) 其中,默认是全部元素的累计和,axis=0 表示按列统计,axis=1 表示按行统计。
    在绘制 CDF 前的准备工作中,可用来做离散值的统计。

    >>> a = np.array([[1,2,3], [4,5,6]])
    >>> a
    array([[1, 2, 3],
           [4, 5, 6]])
    >>> np.cumsum(a)
    array([ 1,  3,  6, 10, 15, 21])
    >>> np.cumsum(a,axis=0)      # sum over rows for each of the 3 columns
    array([[1, 2, 3],
           [5, 7, 9]])
    >>> np.cumsum(a,axis=1)      # sum over columns for each of the 2 rows
    array([[ 1,  3,  6],
           [ 4,  9, 15]])
    
  • 均值方差:np.mean(arr), np.var(arr) 默认是全部元素,也可以指定按行或按列,详见函数方法介绍。

  • 带有 np.nan 值的均值和方差:np.nanmean(arr), np.nanvar(arr) 不指定维度的话默认是全部非np.nan 值的均值和方差。
    np.nan... 还支持很多其他统计值的函数。【注】该方法可以很有效地用来在做统计时,屏蔽某些特定值的干扰。例如:可以将矩阵中的全部<0的元素转换为 np.nan ,然后再统计就可屏蔽原矩阵中负数元素的影响。

    >>> a = np.array([[1, np.nan], [3, 4]])
    >>> np.nanmean(a)
    2.6666666666666665
    >>> np.nanvar(a)
    1.5555555555555554
    
  • 各种范数的计算 【说明文档】常见范数的数学定义与 Numpy 实现

多矩阵操作(加减、乘法、数乘、点积、哈达马乘积等)

x1x2数学操作函数选择示例
scalarscalar两数相乘np.dot() 或 *3 * 7 --> 21
np.dot(3, 7) --> 21
scalar1-D array向量数乘np.dot() 或 np.multiply()np.dot(3, [1, 4]) --> [ 3 12]
np.multiply(3, [1, 4]) --> [ 3 12]
scalar2-D array矩阵数乘np.dot() 或 np.multiply()np.dot(3, np.arange(0, 4).reshape(2, 2)) --> [[0 3], [6 9]]
np.multiply(3, np.arange(0, 4).reshape(2, 2)) --> 同上
1-D array1-D array点积
(内积、数量积)
np.dot() 或 np.matmul()np.dot([2, 5, 7], [1, 4, 1]) --> 29
np.matmul([2, 5], [1, 4]) --> 22
2-D array2-D array矩阵乘法np.dot() 或 np.matmul()x1 = np.arange(0, 3).reshape(1, 3)
x2 = np.arange(0, 6).reshape(3, 2)
np.dot(x1, x2) --> [[10 13]]
np.matmul(x1, x2) --> [[10 13]]
2-D array2-D array哈达马乘积np.multiply()x3 = np.arange(0, 3).reshape(1, 3)
x4 = np.arange(0, 3).reshape(1, 3)
np.multiply(x3, x4) --> [[0 1 4]]
np.multiply([2, 5, 6], [1, 4, 3]) --> [ 2 20 18]

存储与加载

.txt .csv 格式

  • 存储 :np.savetxt(fname="use_info.csv", X=sequence_array)
    fname 不需要提前打开,不需要提供文件handle,若该文件已经存在,保存后会覆盖原文件。
  • 加载:use_info = np.loadtxt(fname="use_info.csv")
    use_info 类型为 ndarray, 和保存前的sequence_array类型、数值都一样。

.npy 格式

注意,该保存操作会在保存文件的名字自动添加 .npy 的后缀。

>>> x = np.arange(10)
>>> np.save('file_out', x)
>>> np.load('file_out.npy')
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

.npz 格式

  • 存储:将多个矩阵存放在一个文件当中,np.savez(),另外 np.savez_compressed() 多一个压缩的操作,也是要注意会将文件名加.npz 的后缀;
  • 加载:np.load()
>>> test_array = np.random.rand(3, 2)
>>> test_vector = np.random.rand(4)
>>> np.savez_compressed('/tmp/123', a=test_array, b=test_vector)
>>> loaded = np.load('/tmp/123.npz')
>>> print(np.array_equal(test_array, loaded['a']))
True
>>> print(np.array_equal(test_vector, loaded['b']))
True
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值