码迷,mamicode.com
首页 > 其他好文 > 详细

Numpy 基础学习

时间:2018-03-08 00:07:17      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:实例代码   nbsp   item   warning   算数运算   布尔   plot   script   科学计算   

 

Numpy是python科学计算的基础包,为python提供快速的数组处理能力,也可以作为在算法之间传递数据的容器

 

安装相关软件包

安装需要的包

pip3 install numpy/pandas/mtaplotlib/ipython/scipy/xlrd/lxml/basemap/pymogo/PyQt/statsmodels/PyTables

 

验证ipython

技术分享图片

 

 

Numpy

NumPy的主要对象是同质多维数组。它是一张表,所有元素(通常是数字)的类型都相同,并通过正整数元组索引。在NumPy中,维度称为轴。轴的数目为秩rank。

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

 

Numpy的ndarray:一种多维数组对象

 

例如:

3D空间中的点的坐标[1, 2, 1]是rank为1的数组,因为它具有一个轴。该轴的长度为3。在下面所示的示例中,数组的rank为2(它是2维的)。

第一维度(轴)的长度为2,第二维度的长度为3。
[[ 1., 0., 0.],[ 0., 1., 2.]]

 

NumPy的数组的类称为ndarray。别名为array

实例代码与说明:

In [48]: import numpy as np

In [49]: a = np.arange(15).reshape(3,5)  #reshape可以理解为设置维度,3行5列

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

 

数组的维度shape。这是一个整数的元组,表示每个维度中数组的大小。

对于具有n行和m列的矩阵,shape将是(n,m)。 因此,shape元组的长度就是rank或维度的个数ndim。

In [51]: a.shape 
Out[51]: (3, 5)

In [52]: a.ndim    ##数组的轴(维度)的个数。在Python中,维度的数量被称为rank。
Out[52]: 2

In [58]: a.size    ##数组元素的总数。这等于shape的元素的乘积。
Out[58]: 15

##数组中每个元素的字节大小。例如,元素为float64类型的数组的itemsize为8(=64/8),而complex32类型的数组的comitemsize为4(=32/8)。它等于ndarray.dtype.itemsize。
In [53]: a.itemsize    
Out[53]: 8

In [54]: type(a)
Out[54]: numpy.ndarray

In [55]: b = np.array([6,7,8])

In [56]: b
Out[56]: array([6, 7, 8])

 

 创建数组

创建数组最简单的方法用array函数,array函数会为数组推断出一个合适的数据类型,数据类型保存在dtype对象中,例如

In [4]: data = [5,3,11,2.3,0]

In [5]: arr1 = np.array(data)

In [6]: arr1
Out[6]: array([  5. ,   3. ,  11. ,   2.3,   0. ])

In [7]: data2 = [[1,2,4,5],[5,6,7,8]]

In [8]: arr2 = np.array(data2)

In [9]: arr2
Out[9]:
array([[1, 2, 4, 5],
       [5, 6, 7, 8]])

In [10]: arr1.dtype
Out[10]: dtype(float64)

In [11]: arr2.dtype
Out[11]: dtype(int32)

 

python内置函数range函数的数组版arange

In [12]: np.arange(15)
Out[12]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

技术分享图片

 

 

 ndarray的数据类型 dtype

dtype 用于说明数组数据类型的对象

dtype含有ndarray将一块内存解释为特定数据类型所需的信息,语法

arr3 = np.array([数组],dtype=np.float64)        #数组类型

 

通过astype方法转化dtype

arr1 = np.array([5,3,11,2.3,0])
float_arr = arr1.astype(np.float64)

如果数组元素都为字符串可用astype转换为数值类型,调用astype会创建出一个新的数组,即使新数组和老数组dtype相同

如果浮点型数组转换为整数,小数点后面的将会被截断,并且不会四舍五入

 

数组间的转换


数组A = 。。
数组B = 。。
数组A.astype(数组B.dtype)

 

数组运算(矢量化)

数组与标量的算数运算应用到每个值

In [13]: arr1
Out[13]: array([  5. ,   3. ,  11. ,   2.3,   0. ])

In [14]: arr1 * arr1
Out[14]: array([  25.  ,    9.  ,  121.  ,    5.29,    0.  ])

In [15]: arr1 - arr1
Out[15]: array([ 0.,  0.,  0.,  0.,  0.])

In [16]: 1 / arr1
C:\Program Files\Python35\Scripts\ipython3:1: RuntimeWarning: divide by zero encountered in true_divide
Out[16]: array([ 0.2       ,  0.33333333,  0.09090909,  0.43478261,         inf])

In [17]: 1 / arr1 ** 0.5
C:\Program Files\Python35\Scripts\ipython3:1: RuntimeWarning: divide by zero encountered in true_divide
Out[17]: array([ 0.4472136 ,  0.57735027,  0.30151134,  0.65938047,         inf])

In [18]:

 

索引和切片

一维数组

In [25]: arr = np.array([4,3,6,7,2,7,9,8])      #一维数组与python的列表取值方式一样

In [26]: arr
Out[26]: array([4, 3, 6, 7, 2, 7, 9, 8])

In [27]: arr[0]
Out[27]: 4

In [28]: arr[1]
Out[28]: 3

In [29]: arr[3:6]            #取值索引为 3,4,5的值
Out[29]: array([7, 2, 7])

In [30]: arr[3:6] = 11          #赋值为所有

In [31]: arr
Out[31]: array([ 4,  3,  6, 11, 11, 11,  9,  8])

 

二维数组

各索引位置上的值不再是一个标量,而是一个一维数组(python里的列表)

In [33]: arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])  #shape为(3,3)
In [
34]: np.ndim(arr2d)      #二维数组查看方法 Out[34]: 2 In [35]: arr2d[2] Out[35]: array([7, 8, 9])

所以,可以对单个元素进行递归访问

In [35]: arr2d[2]
Out[35]: array([7, 8, 9])

In [36]: arr2d[2][0]
Out[36]: 7

二维数组索引方式

技术分享图片

 

多维数组索引

In [37]: arr3d = np.array([[[1,2,3],[4,5,6]],[[7,8,9,],[10,11,12]]])

In [38]: arr3d
Out[38]:
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])

In [39]: arr3d[0]              #取第一个值
Out[39]:
array([[1, 2, 3],
       [4, 5, 6]])

In [40]: arr3d[0] = 42          #给元素赋值

In [41]: arr3d[0]
Out[41]:
array([[42, 42, 42],
       [42, 42, 42]])

In [42]: arr3d              #新的数组
Out[42]:
array([[[42, 42, 42],
        [42, 42, 42]],

       [[ 7,  8,  9],
        [10, 11, 12]]])

In [43]: arr3d[1,0]          #多维数组元素取值,等同于 arr3d[1][0]
Out[43]: array([7, 8, 9])

 

切片索引

二维数组切片

技术分享图片

 

ndarry的切片语法跟python列表的取值差不多,例

In [45]: arr2d
Out[45]:
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

In [46]: arr2d[:2]
Out[46]:
array([[1, 2, 3],
       [4, 5, 6]])

#一次传入多个切片取值

 In [47]: arr2d[:2,1:]        #取前两行的值,再取其索引为1及以后的值
 Out[47]:
 array([[2, 3],
      [5, 6]])

  #对高维数组切片

  arr2d[:,:1]        #算作是语法

 

布尔型索引

布尔型数组可用于数组索引,布尔型数组的长度必须与被索引的轴的长度一致

In [48]: names = np.array([Bob,Joe,will,Bob,will,Joe,Joe])

In [49]: data = randn(7,4)

In [50]: names
Out[50]:
array([Bob, Joe, will, Bob, will, Joe, Joe],
      dtype=<U4)

In [51]: data
Out[51]:
array([[ 0.10178629, -1.07043495,  0.39996302,  0.86182796],
       [-0.4353786 , -0.03595137, -0.50582915,  0.72286381],
       [-0.08335713, -0.88924282, -0.34335741, -1.11461641],
       [-0.69570247,  2.41029154, -0.62120433, -0.54820488],
       [-0.56408913, -0.43663855,  0.00482595,  0.36397724],
       [-0.32140443, -1.84666651,  0.11527445, -2.36827836],
       [-1.72703212,  0.13889588,  0.93259899, -0.92023785]])

 

 In [57]: names == ‘Bob‘
 Out[57]: array([ True, False, False, True, False, False, False], dtype=bool)

 In [58]: data[names==‘Bob‘]      #根据名称的索引取data里的值
 Out[58]:
 array([[ 0.10178629, -1.07043495, 0.39996302, 0.86182796],
    [-0.69570247, 2.41029154, -0.62120433, -0.54820488]])

 In [59]: data[names==‘Bob‘,2:]    #取值,与切片整数混合使用
 Out[59]:
 array([[ 0.39996302, 0.86182796],
     [-0.62120433, -0.54820488]])

 

 #选择非值操作,可使用!= 或者 - 符号表示非值,例:

 In [62]: names != ‘Bob‘

  Out[62]: array([False, True, True, False, True, True, True], dtype=bool)

 

 In [64]: data[-(names == ‘Bob‘)]

 Out[64]:
 array([[-0.4353786 , -0.03595137, -0.50582915, 0.72286381],
  [-0.08335713, -0.88924282, -0.34335741, -1.11461641],
  [-0.56408913, -0.43663855, 0.00482595, 0.36397724],
  [-0.32140443, -1.84666651, 0.11527445, -2.36827836],
  [-1.72703212, 0.13889588, 0.93259899, -0.92023785]])

 

 #将data中的负值设置为0

 In [69]: data[data<0]
 Out[69]:
 array([-1.07043495, -0.4353786 , -0.03595137, -0.50582915, -0.08335713,
    -0.88924282, -0.34335741, -1.11461641, -0.69570247, -0.62120433,
    -0.54820488, -0.56408913, -0.43663855, -0.32140443, -1.84666651,
    -2.36827836, -1.72703212, -0.92023785])

 In [70]: data[data<0] = 0

 In [71]: data
 Out[71]:
 array([[ 0.10178629, 0. , 0.39996302, 0.86182796],
    [ 0. , 0. , 0. , 0.72286381],
    [ 0. , 0. , 0. , 0. ],
    [ 0. , 2.41029154, 0. , 0. ],
    [ 0. , 0. , 0.00482595, 0.36397724],
    [ 0. , 0. , 0.11527445, 0. ],
    [ 0. , 0.13889588, 0.93259899, 0. ]])

 In [72]:

 #通过一维布尔数组设置正行或整列的值

 In [74]: data[names != ‘Joe‘] = 0

 In [75]: data
 Out[75]:
 array([[ 0. , 0. , 0. , 0. ],
    [ 0. , 0. , 0. , 0.72286381],
    [ 0. , 0. , 0. , 0. ],
    [ 0. , 0. , 0. , 0. ],
    [ 0. , 0. , 0. , 0. ],
    [ 0. , 0. , 0.11527445, 0. ],
    [ 0. , 0.13889588, 0.93259899, 0. ]])

 In [76]:

 

花式索引

花式索引是利用整数进行索引

技术分享图片

一次性传入多个索引数组

技术分享图片

 技术分享图片

 

数组转置和轴对换

技术分享图片

技术分享图片

 

通用函数

技术分享图片

技术分享图片

 

技术分享图片

技术分享图片

技术分享图片

 

Numpy 基础学习

标签:实例代码   nbsp   item   warning   算数运算   布尔   plot   script   科学计算   

原文地址:https://www.cnblogs.com/FRESHMANS/p/8490857.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!