zoukankan      html  css  js  c++  java
  • ndarray:一种多维数组对象

    ndarray是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的。每个数组都有一个shape(一个表示各维度大小的元组)和一个dtype(一个用于说明数组数据类型的对象)。

    In [1]: import numpy as np
    
    In [2]: data = np.array([[1,2,3,4],[5,6,7,8]])
    
    In [3]: data
    Out[3]:
    array([[1, 2, 3, 4],
           [5, 6, 7, 8]])
    In [5]: data.shape
    Out[5]: (2, 4)
    
    In [6]: data.dtype
    Out[6]: dtype('int32')

    Part 1 :创建ndarray的方法

      array()

      arange()

      linspace()

      zeros()

      ones()

      empty()

      eye()

    一 array()

      类似Python中的列表,但有两点不同。

        array长度是预先定好的,没有append方法。

        执行乘法操作时。示例。

    import numpy as np
    
    a=np.array([1,2,3,4,5])
    print('numpy',a*6)
    
    l=[1,2,3,4,5]
    print('python',l*5)

      输出:  

    numpy [ 6 12 18 24 30]
    python [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]

       应用场景 1)

        假如有这样一个场景,将[1,2,3,4,5,6,7] 美元货币转为人民币,这个时候,numy.array便能较好的实现效果。

      python能不能实现呢?也是可以的。两种方法,一种方法是循环遍历,乘以汇率。另外一种是使用内置函数map函数。有逼格。

      注意,python3中,map返回的是迭代器。

    import numpy as np
    
    a=np.array([1,2,3,4,5])
    print('numpy',a*6)
    
    l=[1,2,3,4,5]
    print('python',l*5)
    print('map函数',list(map(lambda x:x*6,l)))

      应用场景 2)

        有1000个商品,每个商品数量随机,商品价格随机,求总金额。 array实现起来也比较简单。

        最后调用 .sum()方法

    import numpy as np
    import random
    p=np.array([random.uniform(10,200) for _ in range(1000)])
    n=np.array([random.randint(20,30) for _ in range(1000)])
    print((p*n).sum())  #.sum()

      同样,用python能不能实现呢?也是可以的,有两种方法。一种方法是for循环,一种方法是使用内置函数zip函数。很有逼格,老铁。

      方法1:

    s=0
    p=[random.uniform(10,200) for _ in range(1000)]
    n=[random.randint(10,20) for _ in range(1000)]
    for i in range(1000):
        s+=p[i]*n[i]
    print(s)

      方法2 :zip方法。注意,zip函数返回来的是一个迭代器。zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

    p=[random.uniform(10,200) for _ in range(1000)]
    n=[random.randint(10,20) for _ in range(1000)]
    s=0
    for price,num in zip(p,n):
       s+=price*num
    print(s)

    二 linspace(x,y,n)

      将x-y,之间 n 均等分

      类似arange(),第三个参数为数组长度。

    x=np.linspace(-100,100,10000)
    x

      输出:

    array([-100.      ,  -99.979998,  -99.959996, ...,   99.959996,
             99.979998,  100.      ])

      利用linspace画图

    import numpy as np
    import matplotlib.pyplot as plt
    x=np.linspace(-100,100,10000)
    y=x**2
    plt.plot(x,y)
    plt.show()

      输出:

      

    三  arange()

      基本和range方法一样用

      不同点,步长支持浮点数。

    arr=np.arange(1,20,0.5)
    arr

      输出:

    array([ 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. , 10.5, 11. , 11.5,
           12. , 12.5, 13. , 13.5, 14. , 14.5, 15. , 15.5, 16. , 16.5, 17. ,
           17.5, 18. , 18.5, 19. , 19.5])

    四 zeros()

      根据指定形状和dtype,创建全0数组

    arr=np.zeros(10)
    arr

      输出: 默认是浮点型

    array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

      

      可以指定类型,参数是dtype

    arr=np.zeros(10,dtype='int')
    arr

      输出:

    array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

      

      可以创建二维数组

    arr=np.zeros((3,4),dtype='int')
    arr

      输出:

    array([[0, 0, 0, 0],
           [0, 0, 0, 0],
           [0, 0, 0, 0]])

    五 ones() 

      和zeros 类似,根据指定形状和dtype,创建全1 数组,可以创建二维数组。

    六 empty()

      根据指定形状和dtype,创建空数组(随机数填充),可以创建二维数组。

    arr=np.empty(100)
    arr

      输出:

    array([7.33501733e-312, 0.00000000e+000, 3.60739284e-313, 4.94065646e-324,
           7.33501739e-312, 7.33501604e-312, 7.33371324e-312, 5.30498948e-313,
           0.00000000e+000, 0.00000000e+000, 7.33501604e-312, 0.00000000e+000,
           5.72938864e-313, 4.94065646e-324, 7.33501739e-312, 7.33501604e-312,
           7.33371324e-312, 7.42698527e-313, 0.00000000e+000, 0.00000000e+000,
           1.50690022e-321, 0.00000000e+000, 7.85138443e-313, 4.94065646e-324,
           7.33501740e-312, 5.92878775e-323, 7.33371322e-312, 9.54898106e-313,
           0.00000000e+000, 0.00000000e+000, 1.50690022e-321, 0.00000000e+000,
           9.97338022e-313, 4.94065646e-324, 7.33501740e-312, 5.92878775e-323,
           7.33371324e-312, 1.16709769e-312, 0.00000000e+000, 0.00000000e+000,
           7.33499531e-312, 0.00000000e+000, 1.20953760e-312, 4.94065646e-324,
           7.33501741e-312, 7.33499531e-312, 7.33371324e-312, 1.37929726e-312,
           0.00000000e+000, 0.00000000e+000, 7.33499531e-312, 0.00000000e+000,
           1.42173718e-312, 4.94065646e-324, 7.33501741e-312, 7.33499531e-312,
           7.33371324e-312, 1.59149684e-312, 0.00000000e+000, 0.00000000e+000,
           3.18994064e+231, 0.00000000e+000, 1.63393676e-312, 5.87880625e+250,
           7.33501741e-312, 1.77111852e+159, 7.33371323e-312, 1.80369642e-312,
           8.97461399e+245, 0.00000000e+000, 5.77253125e+250, 0.00000000e+000,
           1.84613634e-312, 1.62482249e+265, 7.33501741e-312, 1.42973900e+188,
           7.33371324e-312, 2.01589600e-312, 1.72351640e+212, 0.00000000e+000,
           1.72762649e+212, 0.00000000e+000, 2.05833592e-312, 3.33203517e+178,
           7.33501742e-312, 7.09013607e+274, 7.33371324e-312, 2.22809558e-312,
           4.13443852e-087, 0.00000000e+000, 1.53172818e-154, 0.00000000e+000,
           2.27053550e-312, 4.85705098e+226, 7.33501742e-312, 5.84384734e+250,
           1.52845066e-154, 5.88999540e+250, 7.42539480e+221, 7.70887102e-315])

    七 eye()

      根据指定边长和dtype创建单位矩阵。

    arr=np.eye(10)
    arr

      输出:

    array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
           [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
           [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
           [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
           [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
           [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])

    Part 2 :ndarray的数据类型

      dtype(数据类型)是一个特殊的对象,它含有ndarray将一块内存解释为特定数据类型所需的信息。

    In [3]: arr1 = np.array([1,2,3],dtype=np.float64)
    
    In [4]: arr2 = np.array([1,2,3],dtype=np.int32)
    
    In [5]: arr1.dtype
    Out[5]: dtype('float64')
    
    In [6]: arr2.dtype
    Out[6]: dtype('int32')

      dtype是numpy如此强大和灵活的原因之一。多数情况下,他们直接映射到相应的机器表示,这使得‘读写磁盘上的二进制数据流’以及‘集成低级语言代码(如C,Fortran)’等工作边的更加简单。

      

      你可以通过ndarray的astype方法显示的转换换其dtype

    In [7]: arr = np.array([1,2,3,4])
    
    In [8]: arr
    Out[8]: array([1, 2, 3, 4])
    
    In [9]: arr.dtype
    Out[9]: dtype('int32')
    
    In [10]: arr1 = arr.astype(np.float64)
    
    In [11]: arr1.dtype
    Out[11]: dtype('float64')

      注意:调用astype无论如何都会创造出一个新的 数组(原始数组的一份拷贝),即使新dtype跟苑dtype相同也是如此。

    Part 3 :基本的索引和切片

    In [12]: arr = np.arange(10)
    
    In [13]: arr
    Out[13]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
    In [14]: arr[5]
    Out[14]: 5
    
    In [15]: arr[5:8]
    Out[15]: array([5, 6, 7])
    
    In [16]: s = arr[5:8]
    In [19]: s
    Out[19]: array([5, 6, 7])
    
    In [20]: s[1] = 55555
    
    In [21]: s
    Out[21]: array([    5, 55555,     7])
    
    In [22]: arr
    Out[22]:
    array([    0,     1,     2,     3,     4,     5, 55555,     7,     8,
               9])

      跟列表最重要的区别在于,数组切片是原始数组的视图。这意味着数据不会被复制,视图上的任何修改都会直接反应到原数组上。因为numpy的设计目的是处理大数据。

      如果你想要得到一份副本而非视图。就需要显式的进行复制操作。

    In [23]: arr = np.arange(10)
    
    In [24]: arr
    Out[24]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
    In [25]: s = arr[5:8].copy()
    
    In [26]: s
    Out[26]: array([5, 6, 7])
    
    In [27]: s[1] = 55555
    
    In [28]: s
    Out[28]: array([    5, 55555,     7])
    
    In [29]: arr
    Out[29]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

    补充

      1 一维数组 转换 二维数组.。reshape方法

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

      输出:

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

      2  int类型数组 与 浮点型 数组之间的转换 。astype方法

    arr=np.arange(10,dtype='int')
    arr

      输出: 这是整型

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

      

      直接调用astype()

    arr.astype('float')

      输出:

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

       

      3 索引

        1 一维数组 arr[3]

        2 二维数组

          arr[3][3]  

          arr[3,3]  推荐这个方法。与下面切片联系紧密。

      4 切片

    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])

      想取出下面数组,怎么办?

    array([[ 6,  7],
           [11, 12]])

      用推荐的索引稍加变动。

    arr[1:3,1:3]

       5 和列表不同的,数组的切片不是自动复制,对切片数组的修改会影响到原切片。

      

       怎么办呢,加copy()方法

      

  • 相关阅读:
    2013 ACM/ICPC Asia Regional Changsha Online G Goldbach
    【转】海量数据求中位数
    【转】如何在vmware中如何设置ip
    十大基本功之testbench
    图像处理与计算机视觉:基础,经典以及最近发展
    Quartus II调用modelsim无缝仿真
    ise和quartus共用仿真软件
    modesim 仿真问题
    Altium Designer设计PCB中如何开槽
    原理图间的 总线接口
  • 原文地址:https://www.cnblogs.com/654321cc/p/8401089.html
Copyright © 2011-2022 走看看