python科学计算工具包numpy简介

numpy是python中非常常见且特别强大的科学计算工具包,它具有强大的N维数组对象:ndarray,可以对数组结构整体进行运算(如矩阵计算),不用循环遍历整个数组,同时可以产生随机数、线性代数、 傅里叶变换等科学操作,十分方便。

关于numpy的功能我不再过多介绍,接下来将简单介绍numpy的基础用法

1. numpy的基础数据结构

  1. 创建数组

    • array()函数:可以将列表、元组、生成器等创建数组

    • arange()函数:用法类似于range()函数

    • linspace()函数:返回含有[start, end]区间内num个均匀间隔元素的数组

      用法:linspace(start, end, num, endpoint=True, retstep=False)

      endpoint:是否包含最后一个值end,默认为True

      retstep:输出(结果, 步长)的一个元组,默认为False

    • zeros()函数:创建n个元素均为0的数组

      用法:zeros(shape, dtype='float64')

      衍生:zeros_like()生成一个与另外一个数组形状相同的用0填充的数组

    • ones()函数:与zeros()函数很相似,只不过是用1填充

    • eyes()函数:生成一个N*N的单位矩阵(对角线为1,其他位置为0)

      # Example1
      >>> import numpy as np
      >>> a1 = np.array([1, 2, 3, 4])  # 一维数组
      >>> a2 = np.array(((1, 2), (3, 4)))  # 二维数组
      >>> print(a1)
      [1 2 3 4]
      >>> print(a2)
      [[1 2]
       [3 4]]
      # Tips: numpy的array与python普通数据结构list,tuple的最直接区别就是数据之间没有逗号分隔
      
      # Example2
      >>> import numpy as np
      >>> b = np.arange(0, 10, 2)
      >>> print(b)
      [0 2 4 6 8]
      # Tips: range()函数的(起点,终点,步长)的用法同样适用于arange()
      
      #Example3
      >>> c1 = np.linspace(1, 10, 19)
      >>> print(c1)
      [ 1.   1.5  2.   2.5  3.   3.5  4.   4.5  5.   5.5  6.   6.5  7.   7.5
        8.   8.5  9.   9.5 10. ]
      >>>
      >>> c2 = np.linspace(1, 5, 4, endpoint=False, retstep=True)
      >>> print(c2)
      (array([1., 2., 3., 4.]), 1.0)
      
      # Example4
      >>> d1 = np.zeros(5)
      >>> print(d1)
      [0. 0. 0. 0. 0.]
      
      >>> d2 = np.zeros((2, 3))
      >>> print(d2)
      [[0. 0. 0.]
       [0. 0. 0.]]
      >>> print(d2.dtype)
      float64
      
      >>> d3 = np.array([[1, 2], [4, 5]])
      >>> d4 = np.zeros_like(d3)
      >>> print(d4)
      [[0 0]
       [0 0]]
      
      # Example5
      >>> e = np.eye(5)
      >>> print(e)
      [[1. 0. 0. 0. 0.]
       [0. 1. 0. 0. 0.]
       [0. 0. 1. 0. 0.]
       [0. 0. 0. 1. 0.]
       [0. 0. 0. 0. 1.]]
      
  2. 数组array常见的几个方法

    • ndim:返回数组的维度,也称rank

    • shape方法:返回数组的形状,如二维数组返回的就是x行y列

    • size方法:返回数组中全部元素的个数

    • dtype方法:看元素的数据类型

    • itemsize方法:每个元素占用的字节大小

    • data方法:数组对应的内存缓存区

      >>> import numpy as np
      >>> a = np.array([[1, 2, 3], [4, 5, 6]])
      
      >>> print(a.ndim)
      2
      >>> print(a.shape)
      (2, 3)
      >>> print(a.size)
      6
      >>> print(a.dtype)
      int32
      >>> print(a.itemsize)
      4
      >>> print(a.data)
      <memory at 0x00000205B733BD68>
      

2. numpy的常用函数、方法

改变数组形状

  1. 转置

    numpy中用.T对数组转置(一维数组转置无效)

    >>> import numpy as np
    
    >>> a = np.array([[1, 2, 3], [4, 5, 6]])
    >>> print(a)
    [[1 2 3]
     [4 5 6]]
    
    >>> b = a.T
    >>> print(b)
    [[1 4]
     [2 5]
     [3 6]]
    
  2. 改变数组形状(元素个数必须对应):reshape()

    .reshape(x, y)改变数组形状为一个x行y列的数组,注意元素个数必须一样,否则会报错

    Tips: .reshape()方法会返回一个新数组,而不会改变数组本身

    >>> a = np.arange(10).reshape(2, 5)
    >>> print(a)
    [[0 1 2 3 4]
     [5 6 7 8 9]]
    >>> print(a.shape)
    (2, 5)
    
    # 方法2
    >>> a = np.arange(10)
    >>> b = np.reshape(a, (2, 5))
    >>> print(b)
    [[0 1 2 3 4]
     [5 6 7 8 9]]
    
  3. 改变数组形状(元素个数不用对应): resize()

    Tips: .resize()方法会改变数组本身

    >>> a = np.arange(10)
    
    >>> print(np.resize(a, (3, 3)))
    [[0 1 2]
     [3 4 5]
     [6 7 8]]
    # 元素多余时舍掉
    
    >>> print(np.resize(a, (4, 4)))
    [[0 1 2 3]
     [4 5 6 7]
     [8 9 0 1]
     [2 3 4 5]]
    # 元素不足时重复已有元素
    
  4. reshape()resize()对比

    >>> a = np.arange(10)
    >>> print(a.reshape(2, 5))
    [[0 1 2 3 4]
     [5 6 7 8 9]]
    >>> print(a.resize(2, 4))
    None
    >>> print(a)
    [[0 1 2 3]
     [4 5 6 7]]
    # 这是因为reshape返回一个新的数组,而resize不会,他会改变原数组
    
    # 为了使resize也返回一个新的数组,需要使用np.resize()
    >>> a = np.arange(10)
    >>> print(np.reshape(a, (2, 5)))
    [[0 1 2 3 4]
     [5 6 7 8 9]]
    >>> print(np.resize(a, (2, 3)))
    [[0 1 2]
     [3 4 5]]
    >>> print(a)
    [0 1 2 3 4 5 6 7 8 9]
    # 此时resize不会改变原来的数组了
    

数组中元素类型的转换

.astype()可以改变数组中元素的类型

>>> a = np.arange(5, dtype=int)
>>> b = a.astype(np.float)

>>> print(a.dtype, b.dtype)
int32 float64

数组的简单运算

数组有加减乘除运算,规则与矩阵的加减乘除一致。

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

>>> print(a + 10)
[[10 11 12 13 14]
 [15 16 17 18 19]]

>>> print(a - 10)
[[-10  -9  -8  -7  -6]
 [ -5  -4  -3  -2  -1]]

>>> print(a * 10)
[[ 0 10 20 30 40]
 [50 60 70 80 90]]

>>> print(a / 10)
[[0.  0.1 0.2 0.3 0.4]
 [0.5 0.6 0.7 0.8 0.9]]

>>> print(a.mean())
4.5

>>> print(a.max())
9

>>> print(a.min())
0

>>> print(a.std())  # 求标准差
2.8722813232690143

>>> print(a.var())  # 求方差
8.25

>>> print(a.sum())
45
>>> print(np.sum(a, axis=0))  # axis=0,按列求和,axis=1,按行求和
[ 5  7  9 11 13]
posted @ 2020-04-16 11:09  海淀区小吴同学  阅读(472)  评论(0编辑  收藏  举报