zoukankan      html  css  js  c++  java
  • numpy常用用法总结

    numpy 简介

    numpy的存在使得python拥有强大的矩阵计算能力,不亚于matlab。
    官方文档(https://docs.scipy.org/doc/numpy-dev/user/quickstart.html)

    各种用法介绍

    首先是numpy中的数据类型,ndarray类型,和标准库中的array.array并不一样。

    ndarray的一些属性

    ndarray.ndim
    the number of axes (dimensions) of the array. In the Python world, the number of dimensions is referred to as rank.
    ndarray.shape
    the dimensions of the array. This is a tuple of integers indicating the size of the array in each dimension. For a matrix with n rows and m columns, shape will be (n,m). The length of the shape tuple is therefore the rank, or number of dimensions, ndim.
    ndarray.size
    the total number of elements of the array. This is equal to the product of the elements of shape.
    ndarray.dtype
    an object describing the type of the elements in the array. One can create or specify dtype’s using standard Python types. Additionally NumPy provides types of its own. numpy.int32, numpy.int16, and numpy.float64 are some examples.
    ndarray.itemsize
    the size in bytes of each element of the array. For example, an array of elements of type float64 has itemsize 8 (=64/8), while one of type complex32 has itemsize 4 (=32/8). It is equivalent to ndarray.dtype.itemsize.
    ndarray.data
    the buffer containing the actual elements of the array. Normally, we won’t need to use this attribute because we will access the elements in an array using indexing facilities.

    ndarray的创建

    >>> import numpy as np
    >>> a = np.array([2,3,4])
    >>> a
    array([2, 3, 4])
    >>> a.dtype
    dtype('int64')
    >>> b = np.array([1.2, 3.5, 5.1])
    >>> b.dtype
    dtype('float64')
    

    二维的数组

    >>> b = np.array([(1.5,2,3), (4,5,6)])
    >>> b
    array([[ 1.5,  2. ,  3. ],
           [ 4. ,  5. ,  6. ]])
    

    创建时指定类型

    >>> c = np.array( [ [1,2], [3,4] ], dtype=complex )
    >>> c
    array([[ 1.+0.j,  2.+0.j],
           [ 3.+0.j,  4.+0.j]])
    

    创建一些特殊的矩阵

    >>> np.zeros( (3,4) )
    array([[ 0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.]])
    >>> np.ones( (2,3,4), dtype=np.int16 )                # dtype can also be specified
    array([[[ 1, 1, 1, 1],
            [ 1, 1, 1, 1],
            [ 1, 1, 1, 1]],
           [[ 1, 1, 1, 1],
            [ 1, 1, 1, 1],
            [ 1, 1, 1, 1]]], dtype=int16)
    >>> np.empty( (2,3) )                                 # uninitialized, output may vary
    array([[  3.73603959e-262,   6.02658058e-154,   6.55490914e-260],
           [  5.30498948e-313,   3.14673309e-307,   1.00000000e+000]])
    

    创建一些有特定规律的矩阵

    >>> np.arange( 10, 30, 5 )
    array([10, 15, 20, 25])
    >>> np.arange( 0, 2, 0.3 )                 # it accepts float arguments
    array([ 0. ,  0.3,  0.6,  0.9,  1.2,  1.5,  1.8])
    
    >>> from numpy import pi
    >>> np.linspace( 0, 2, 9 )                 # 9 numbers from 0 to 2
    array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])
    >>> x = np.linspace( 0, 2*pi, 100 )        # useful to evaluate function at lots of points
    >>> f = np.sin(x)
    

    一些基本的运算

    加减乘除三角函数逻辑运算

    >>> a = np.array( [20,30,40,50] )
    >>> b = np.arange( 4 )
    >>> b
    array([0, 1, 2, 3])
    >>> c = a-b
    >>> c
    array([20, 29, 38, 47])
    >>> b**2
    array([0, 1, 4, 9])
    >>> 10*np.sin(a)
    array([ 9.12945251, -9.88031624,  7.4511316 , -2.62374854])
    >>> a<35
    array([ True, True, False, False], dtype=bool)
    

    矩阵运算
    matlab中有.* ,./等等
    但是在numpy中,如果使用+,-,×,/优先执行的是各个点之间的加减乘除法
    如果两个矩阵(方阵)可既以元素之间对于运算,又能执行矩阵运算会优先执行元素之间的运算

    >>> import numpy as np
    >>> A = np.arange(10,20)
    >>> B = np.arange(20,30)
    >>> A + B
    array([30, 32, 34, 36, 38, 40, 42, 44, 46, 48])
    >>> A * B
    array([200, 231, 264, 299, 336, 375, 416, 459, 504, 551])
    >>> A / B
    array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
    >>> B / A
    array([2, 1, 1, 1, 1, 1, 1, 1, 1, 1])
    
    

    如果需要执行矩阵运算,一般就是矩阵的乘法运算

    >>> A = np.array([1,1,1,1])
    >>> B = np.array([2,2,2,2])
    >>> A.reshape(2,2)
    array([[1, 1],
           [1, 1]])
    >>> B.reshape(2,2)
    array([[2, 2],
           [2, 2]])
    >>> A * B
    array([2, 2, 2, 2])
    >>> np.dot(A,B)
    8
    >>> A.dot(B)
    8
    

    一些常用的全局函数

    >>> B = np.arange(3)
    >>> B
    array([0, 1, 2])
    >>> np.exp(B)
    array([ 1.        ,  2.71828183,  7.3890561 ])
    >>> np.sqrt(B)
    array([ 0.        ,  1.        ,  1.41421356])
    >>> C = np.array([2., -1., 4.])
    >>> np.add(B, C)
    array([ 2.,  0.,  6.])
    
    

    矩阵的索引分片遍历

    >>> a = np.arange(10)**3
    >>> a
    array([  0,   1,   8,  27,  64, 125, 216, 343, 512, 729])
    >>> a[2]
    8
    >>> a[2:5]
    array([ 8, 27, 64])
    >>> a[:6:2] = -1000    # equivalent to a[0:6:2] = -1000; from start to position 6, exclusive, set every 2nd element to -1000
    >>> a
    array([-1000,     1, -1000,    27, -1000,   125,   216,   343,   512,   729])
    >>> a[ : :-1]                                 # reversed a
    array([  729,   512,   343,   216,   125, -1000,    27, -1000,     1, -1000])
    >>> for i in a:
    ...     print(i**(1/3.))
    ...
    nan
    1.0
    nan
    3.0
    nan
    5.0
    6.0
    7.0
    8.0
    9.0
    

    矩阵的遍历

    >>> import numpy as np
    >>> b = np.arange(16).reshape(4, 4)
    >>> for row in b:
    ...  print(row)
    ... 
    [0 1 2 3]
    [4 5 6 7]
    [ 8  9 10 11]
    [12 13 14 15]
    >>> for node in b.flat:
    ...  print(node)
    ... 
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    

    矩阵的特殊运算

    改变矩阵形状--reshape

    >>> a = np.floor(10 * np.random.random((3,4)))
    >>> a
    array([[ 6.,  5.,  1.,  5.],
           [ 5.,  5.,  8.,  9.],
           [ 5.,  5.,  9.,  7.]])
    >>> a.ravel()
    array([ 6.,  5.,  1.,  5.,  5.,  5.,  8.,  9.,  5.,  5.,  9.,  7.])
    >>> a
    array([[ 6.,  5.,  1.,  5.],
           [ 5.,  5.,  8.,  9.],
           [ 5.,  5.,  9.,  7.]])
    
    

    resize和reshape的区别
    resize会改变原来的矩阵,reshape并不会

    >>> a
    array([[ 6.,  5.,  1.,  5.],
           [ 5.,  5.,  8.,  9.],
           [ 5.,  5.,  9.,  7.]])
    >>> a.reshape(2,-1)
    array([[ 6.,  5.,  1.,  5.,  5.,  5.],
           [ 8.,  9.,  5.,  5.,  9.,  7.]])
    >>> a
    array([[ 6.,  5.,  1.,  5.],
           [ 5.,  5.,  8.,  9.],
           [ 5.,  5.,  9.,  7.]])
    >>> a.resize(2,6)
    >>> a
    array([[ 6.,  5.,  1.,  5.,  5.,  5.],
           [ 8.,  9.,  5.,  5.,  9.,  7.]])
    
    

    矩阵的合并

    >>> a = np.floor(10*np.random.random((2,2)))
    >>> a
    array([[ 8.,  8.],
           [ 0.,  0.]])
    >>> b = np.floor(10*np.random.random((2,2)))
    >>> b
    array([[ 1.,  8.],
           [ 0.,  4.]])
    >>> np.vstack((a,b))
    array([[ 8.,  8.],
           [ 0.,  0.],
           [ 1.,  8.],
           [ 0.,  4.]])
    >>> np.hstack((a,b))
    array([[ 8.,  8.,  1.,  8.],
           [ 0.,  0.,  0.,  4.]])
    
  • 相关阅读:
    通过串口抓取图片
    Qt也有垃圾回收(通过QScopedPointer实现),下决心在项目里使用QScopedPointer,省了太多事情了,而且更安全!!
    IOS端 margin-top 和 margin-bottom 使用负数时的区别
    使用ROME解析rss,如何获取icon图标
    SVG图片如何调整大小和颜色
    Js点击触发Css3的动画Animations、过渡Transitions效果
    如何判断是否为同一个App,Ionic3如何修改包名
    如何使用JPQL写纯SQL语句
    为何在新线程中使用注解获取不到Spring管理的Bean
    Ionic的NavController 和ModalController 的区别
  • 原文地址:https://www.cnblogs.com/0x12345678/p/6179771.html
Copyright © 2011-2022 走看看