天天看点

【Numpy】Numpy 常用操作总结前言环境矩阵创建(单位阵、全零、全1矩阵等)单矩阵操作(转置、三角阵、找索引、累计和、均值方差、各种范数等)多矩阵操作(加减、乘法、数乘、点积、哈达马乘积等)存储与加载

文章目录

  • 前言
  • 环境
  • 矩阵创建(单位阵、全零、全1矩阵等)
  • 单矩阵操作(转置、三角阵、找索引、累计和、均值方差、各种范数等)
  • 多矩阵操作(加减、乘法、数乘、点积、哈达马乘积等)
  • 存储与加载
    • `.txt .csv` 格式
    • `.npy` 格式
    • `.npz` 格式

前言

本文总结了在使用 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

    可以指

    list

    tube

    等形状上类似于

    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.T

    arr.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 实现

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

  • 加减:同

    shape

    的两个矩阵

    A

    B

    , 两者的和为

    A + B

    , 差为

    A - B

  • 乘法:主要有

    np.matmul()

    ,

    np.multiply()

    ,

    np.dot()

    这三个函数,具体的区别和使用方法,可移步 【说明文档】详解 Numpy 中的各种”乘法“操作 。此处只将常见的操作总结如下:
x1 x2 数学操作 函数选择 示例
scalar scalar 两数相乘 np.dot() 或 *

3 * 7

--> 21

np.dot(3, 7)

--> 21
scalar 1-D array 向量数乘 np.dot() 或 np.multiply()

np.dot(3, [1, 4])

--> [ 3 12]

np.multiply(3, [1, 4])

--> [ 3 12]
scalar 2-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 array 1-D array

点积

(内积、数量积)

np.dot() 或 np.matmul()

np.dot([2, 5, 7], [1, 4, 1])

--> 29

np.matmul([2, 5], [1, 4])

--> 22
2-D array 2-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 array 2-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