zoukankan      html  css  js  c++  java
  • python numpy数组操作

    数组的创建

    import numpy as np

    arr1 = np.array([3,10,8,7,34,11,28,72])

    arr2 = np.array(((8.5,6,4.1,2,0.7),(1.5,3,5.4,7.3,9),

            (3.2,3,3.8,3,3),(11.2,13.4,15.6,17.8,19)))

    print('一维数组:  ',arr1)

    print('二维数组:  ',arr2)

    如上述所示,可以将列表和元组转换为一个数组,在第二个数组中,输入的元素含有整数型和浮点型两种数据类型,但输出的数组

    元素全部是浮点型(原来的整型被强制转换为浮点型了,保证数组元素的一致性)

    数组元素的获取

    import numpy as np
    arr1 = np.array([3,10,8,7,34,11,28,72])
    arr2 = np.array(((8.5,6,4.1,2,0.7),(1.5,3,5.4,7.3,9),
    (3.2,3,3.8,3,3),(11.2,13.4,15.6,17.8,19)))
    print('一维数组: ',arr1)
    print('二维数组: ',arr2)
    print(arr1[[2,3,5,7]])               #数组1的3 4 6 8个元素
    print(arr2[1,2])        #二维数组的第2行第3列的元素   输出的是具体的数值
    print(arr2[2,:])        #二维数组的第3行所有数据    
    print(arr2[:,1])        #二维数组的第2列所有数组
    print(arr2[1:4,1:5])      #二维数组的第2-4行,2-5列的数据   这个地方要注意的,不是分别显示2行5列和2行6列的数据

    print(arr2[[0,1],[2,3]])           #对比一下上面的表达,这个表达要比较注意,表示的是 0 2 第1行第3列的数据,和 1 3第2行第4列的数据输                                                #出的是 [4.1,7.3] 组成的一维数组  

    print(arr2[np.ix_([0,-1],[1,3])])   #第1行第2列,第1行第4列 ;最后一行第2列,最后一行第4列  组成的二维数组  

    print(arr2[np.ix_([0,-1],[1,2,3])])  #第1行第2列,第1行第3列,第1行第4列;最后一行第2列,最后一行第3列,最后一行第4列 组成的二维                                                       #数组

    out:
    [[ 6. 4.1 2. ] [13.4 15.6 17.8]]

    数组的常用属性

        如果不是手工写入的数组,而是从外部读入的数据,此时也许对数据就是一无所知,如该数据的维数,行列数,数据类型等信息,下面通过简短的代码来了解数组的几个常用属性,进而跨出了解数据的第一步。

         在numpy模块中,可以通过genfromtxt函数读取外部文文件的数据,这里的文本文件主要为csv文件和txt文件。关于该函数的语法和重要参数含义如下:

    np.genfrom xt(fname,dtype=<class 'float' >,

    comments = '#',delimiter = None,skip_header = 0,

    skip_footer=0,converters=None,missing

    _values=None,filling_values=None,usecols=None,

    names=None.)

    fname:指定需要读入数据的文件路径。

    dtype:指定读入数据的数据类型,默认为浮点型,如果原数据集中含有字符型数据,必须指定数据类型为“str”

    comments:指定注释符,默认为“#”,如果原数据的行首有“#”,将忽略这些行的读入。

    delimiter:指定数据集的列分割符

    skip_footer:是否跳过数据集的脚注,默认不跳过

    converters:将指定列的数据转换成其他数值。

    miss_values:指定缺失值的标记,如果原数据集含指定的标记,读入后这样的数据就为缺失值。

    filling_values:指定缺失值的填充值。

    usecols:指定需要读入哪些列。

    names:为读入数据的列设置列名称。

    例:

    import numpy as np
    stu_score = np.genfromtxt(fname = r'D:BaiduNetdiskDownload从零开始学Python--数据分析与挖掘第4章 Python数值计算工具--Numpystu_score.txt',
    delimiter=' ',skip_header=1)
    print(type(stu_score))        #查看数据结构
    print(stu_score.ndim)        #查看数据维数
    print(stu_score.shape)      #查看数据行列数
    print(stu_score.dtype)       #查看数组元的数据类型
    print(stu_score.size)          #查看数组元素的个数

     out:

    <class 'numpy.ndarray'>
    2
    (1380, 5)
    float64
    6900

    数组的形状处理

        数组形状处理的手段主要有reshape,resize,ravel,flatten,vstack,hstack,row_stack和colum_stack,下面通过简单的案例

    来解释这些‘方法’或函数的区别。

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

    print(arr3.shape)              #操作前数组的行列数
    print(arr3.reshape(2,9))    #使用reshpe方法更改数组的形状
    print(arr3.shape)          #确认一下原数组的形状有没有被改变

    print(arr3.resize(2,9))       #使用resize方法改变数组的形状
    print(arr3.shape)    

    out:

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

    因此得出:reshape方法不改变原有数组的形状,resize方法改变了原有数组的形状;实际上reshape方法只是返回改变形状后的预览,而resize方法不返回预览,会直接改变数组的形状。

     如果需要将多维数组降为一维数组,利用ravel,flatten和reshape三种方法均可以轻松解决。

    例:

    import numpy as np
    arr4 = np.array([[1,10,100],[2,20,200],[3,30,300]])
    print('原数组: ',arr4)
    #默认排序降维
    print('数组维度: ',arr4.ravel())
    print(arr4.flatten())
    print(arr4.reshape(-1))
    #改变排序模式的降维
    print(arr4.ravel(order = 'F'))
    print(arr4.flatten(order = 'F'))
    print(arr4.reshape(-1,order = 'F'))

     out:

    原数组:
     [[  1  10 100]
     [  2  20 200]
     [  3  30 300]]
    数组维度:
     [  1  10 100   2  20 200   3  30 300]
    [  1  10 100   2  20 200   3  30 300]
    [  1  10 100   2  20 200   3  30 300]
    [  1   2   3  10  20  30 100 200 300]
    [  1   2   3  10  20  30 100 200 300]
    [  1   2   3  10  20  30 100 200 300]

    import numpy as np
    arr4.flatten()[0] = 2000
    print('flatten方法: ',arr4)
    arr4.ravel()[1] = 1000
    print('ravel方法: ',arr4)
    arr4.reshape(-1)[2] = 3000
    print('reshape 方法: ',arr4)

     out:

    flatten方法:
     [[  1  10 100]
     [  2  20 200]
     [  3  30 300]]
    ravel方法:
     [[   1 1000  100]
     [   2   20  200]
     [   3   30  300]]
    reshape 方法:
     [[   1 1000 3000]
     [   2   20  200]
     [   3   30  300]]

    如上结果所示,通过flatten方法实现的降维返回的是复制,因为对降维后的元素做修改,并没有影响到原数组arr4的结果;相反,ravel方法与reshape方法返回的则是视图,通过对视图的改变,是会影响到原数组arr4的.

    vastack用于垂直方向(纵向)的数组堆叠,其功能与row_stack函数一致,而hstack则用于水平方向(横向)的数组合并,其功能与colum_stack函数一致,下面通过例子说明差异:

    import numpy as np
    arr5 = np.array([1,2,3])
    print('vstack纵向堆叠数组: ',np.vstack([arr4,arr5]))
    print('row_stack纵向堆叠数组: ',np.row_stack([arr4,arr5]))
    arr6 = np.array([[5],[15],[25]])
    print('hstack横向合并数组: ',np.hstack([arr4,arr6]))
    print('column_stack横向合并数组: ',np.column_stack([arr4,arr6]))

    out:

    vstack纵向堆叠数组:
     [[   1 1000 3000]
     [   2   20  200]
     [   3   30  300]
     [   1    2    3]]
    row_stack纵向堆叠数组:
     [[   1 1000 3000]
     [   2   20  200]
     [   3   30  300]
     [   1    2    3]]
    hstack横向合并数组:
     [[   1 1000 3000    5]
     [   2   20  200   15]
     [   3   30  300   25]]
    column_stack横向合并数组:
     [[   1 1000 3000    5]
     [   2   20  200   15]
     [   3   30  300   25]]

    如上结果所示,前两个输出是纵向堆叠的效果,后两个则是横向合并的效果.如果是多个数组的纵向堆叠,必须保证每个数组的列数相同.如果将多个数组按横向合并的话,则必须保证每个数组的行数相同.




  • 相关阅读:
    设计模式(2)——工厂模式详解
    直观理解梯度,以及偏导数、方向导数和法向量等
    如何编译和调试Python内核源码?
    VGG(2014),3x3卷积的胜利
    Network in Network(2013),1x1卷积与Global Average Pooling
    ZFNet(2013)及可视化的开端
    一文搞懂 deconvolution、transposed convolution、sub-­pixel or fractional convolution
    从AlexNet(2012)开始
    ImageNet主要网络benchmark对比
    仿射变换及其变换矩阵的理解
  • 原文地址:https://www.cnblogs.com/tinglele527/p/11708353.html
Copyright © 2011-2022 走看看