Python科学计算--NumPy的数组对象ndarray

来源:互联网 发布:最新机顶盒软件排行 编辑:程序博客网 时间:2024/06/05 18:08
NumPy是一个开源的Python科学计算基础库,包含:
  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 整合C/C++/Fortran代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

NumPy是SciPy、Pandas等数据处理或科学计算库的基础

Python已有列表类型,为什么需要一个数组对象?
  • 数组可以去掉元素间运算所需的循环,使一维向量更像单个数据
  • 设置专门的数组对象,经过优化,可以提升这类应用的运算速度
  • 数组对象采用相同的数据类型,有助于节省运算和存储空间
ndarray是一个多为数组对象,有两部分构成:
  • 实际的数据
  • 描述这些数据的元数据(数据维度、数据类型等)
ndarray数组一般要求所有数组元素类型相同(同质),数组下标从0开始

1. NumPy的引用

import numpy as np
尽管别名可以省略和更改,建议使用上述约定的别名

2. ndarray对象的属性



import numpy as npa = np.array([[0,1,2,3,4],[9,8,7,6,5]])a.ndimOut[3]: 2a.shapeOut[4]: (2, 5)a.sizeOut[5]: 10a.dtypeOut[6]: dtype('int32')a.itemsizeOut[7]: 4

3. ndarray数组的元素类型



4. ndarray数组的创建

4.1 从Python中的列表、元组等类型创建ndarray数组

x = np.array(list/tuple)x = np.array(list/tuple, dtype=np.float32)
当np.array()不指定dtype时,NumPy将根据数据情况关联一个dtype类型
x =np.array([0,1,2,3])      #从列表类型创建print(x)[0 1 2 3]x = np.array((4,5,6,7))     #从元组类型创建print(x)[4 5 6 7]x =np.array([[1,2],[9,8],(0.1,0.2)])     #从列表和元组混合类型创建print(x)[[ 1.   2. ] [ 9.   8. ] [ 0.1  0.2]]

4.2 使用NumPy中函数创建ndarray数组

如:arange, ones, zeros等


np.arange(10)Out[14]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])np.ones((3,6))Out[15]:array([[ 1.,  1.,  1.,  1.,  1.,  1.],       [ 1.,  1.,  1.,  1.,  1.,  1.],       [ 1.,  1.,  1.,  1.,  1.,  1.]])np.zeros((3,6),dtype = np.int32)Out[16]:array([[0, 0, 0, 0, 0, 0],       [0, 0, 0, 0, 0, 0],       [0, 0, 0, 0, 0, 0]])np.eye(5)Out[17]:array([[ 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.]])x = np.ones((2,3,4))print(x)[[[ 1.  1.  1.  1.]  [ 1.  1.  1.  1.]  [ 1.  1.  1.  1.]] [[ 1.  1.  1.  1.]  [ 1.  1.  1.  1.]  [ 1.  1.  1.  1.]]]x.shapeOut[20]: (2, 3, 4)


a = np.linspace(1,10,4)aOut[22]: array([  1.,   4.,   7.,  10.])b = np.linspace(1,10,4,endpoint=False)bOut[24]: array([ 1.  ,  3.25,  5.5 ,  7.75])c = np.concatenate((a,b))cOut[26]: array([  1.  ,   4.  ,   7.  ,  10.  ,   1.  ,   3.25,   5.5 ,   7.75])


5. ndarray数组的变换

对于创建后的ndarray数组,可以对其进行维度变换和元素类型变换

5.1 ndarray数组的维度变换

a = np.ones((2,3,4), dtype=np.int32)a.reshape((3,8))Out[28]:array([[1, 1, 1, ..., 1, 1, 1],       [1, 1, 1, ..., 1, 1, 1],       [1, 1, 1, ..., 1, 1, 1]])aOut[29]: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]]])a.resize((3,8))aOut[31]:array([[1, 1, 1, ..., 1, 1, 1],       [1, 1, 1, ..., 1, 1, 1],       [1, 1, 1, ..., 1, 1, 1]])a.flatten()Out[32]: array([1, 1, 1, ..., 1, 1, 1])aOut[33]:array([[1, 1, 1, ..., 1, 1, 1],       [1, 1, 1, ..., 1, 1, 1],       [1, 1, 1, ..., 1, 1, 1]])b = a.flatten()bOut[35]: array([1, 1, 1, ..., 1, 1, 1])

5.2 ndarray数组的类型变换

new_a = a.astype(new_type)
aOut[37]: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]]])b = a.astype(np.float)bOut[39]: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.]]])

astype()方法一定会创建新的数组(原始数据的一个拷贝),即使两个类型一致

5.3 ndarray数组向列表类型转换

ndarray数组向列表类型转换
a = np.full((2,3,4),25,dtype=np.int32)a.tolist()Out[41]:[[[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]], [[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]]]

6. ndarray数组的操作


索引:获取数组中特定位置元素的过程
切片:获取数组元素自己的过程

6.1 一维数组的索引和切片

与Python的列表类似
a = np.array([9,8,7,6,5])a[2]Out[43]: 7a[1:4:2]     #起始编号:终止编号(不含):步长,三元素冒号分割Out[44]: array([8, 6])     #编号0开始从左递增,或-1开始从右递减

6.2 多维数组的索引

a = np.arange(24).reshape((2,3,4))aOut[46]:array([[[ 0,  1,  2,  3],        [ 4,  5,  6,  7],        [ 8,  9, 10, 11]],       [[12, 13, 14, 15],        [16, 17, 18, 19],        [20, 21, 22, 23]]])a[1,2,3]Out[47]: 23a[0,1,2]Out[48]: 6a[-1,-2,-3]     #每个维度一个索引值,逗号分割Out[49]: 17

6.3 多维数组的切片

a = np.arange(24).reshape((2,3,4))aOut[51]:array([[[ 0,  1,  2,  3],        [ 4,  5,  6,  7],        [ 8,  9, 10, 11]],       [[12, 13, 14, 15],        [16, 17, 18, 19],        [20, 21, 22, 23]]])a[:,1,-3]     #选取一个维度用Out[52]: array([ 5, 17])a[:,1:3,:]     #每个维度切片方法与一维数组相同Out[53]:array([[[ 4,  5,  6,  7],        [ 8,  9, 10, 11]],       [[16, 17, 18, 19],        [20, 21, 22, 23]]])a[:,:,::2]     每个维度可以使用步长跳跃切片Out[54]:array([[[ 0,  2],        [ 4,  6],        [ 8, 10]],       [[12, 14],        [16, 18],        [20, 22]]])

7. ndarray数组的运算

7.1 数组与标量之间的运算

数组与标量之间的运算作用于数组的每一个元素
a = np.arange(24).reshape((2,3,4))aOut[56]:array([[[ 0,  1,  2,  3],        [ 4,  5,  6,  7],        [ 8,  9, 10, 11]],       [[12, 13, 14, 15],        [16, 17, 18, 19],        [20, 21, 22, 23]]])a.mean()Out[57]: 11.5a = a/a.mean()     #计算a与元素平均值的商aOut[59]:array([[[ 0.        ,  0.08695652,  0.17391304,  0.26086957],        [ 0.34782609,  0.43478261,  0.52173913,  0.60869565],        [ 0.69565217,  0.7826087 ,  0.86956522,  0.95652174]],       [[ 1.04347826,  1.13043478,  1.2173913 ,  1.30434783],        [ 1.39130435,  1.47826087,  1.56521739,  1.65217391],        [ 1.73913043,  1.82608696,  1.91304348,  2.        ]]])

7.2 NumPy一元函数

a = np.arange(24).reshape((2,3,4))np.square(a)Out[61]:array([[[  0,   1,   4,   9],        [ 16,  25,  36,  49],        [ 64,  81, 100, 121]],                                   #注意数组是否被真实改变       [[144, 169, 196, 225],        [256, 289, 324, 361],        [400, 441, 484, 529]]], dtype=int32)a = np.sqrt(a)aOut[63]:array([[[ 0.        ,  1.        ,  1.41421356,  1.73205081],        [ 2.        ,  2.23606798,  2.44948974,  2.64575131],        [ 2.82842712,  3.        ,  3.16227766,  3.31662479]],       [[ 3.46410162,  3.60555128,  3.74165739,  3.87298335],        [ 4.        ,  4.12310563,  4.24264069,  4.35889894],        [ 4.47213595,  4.58257569,  4.69041576,  4.79583152]]])np.modf(a)Out[64]:(array([[[ 0.        ,  0.        ,  0.41421356,  0.73205081],         [ 0.        ,  0.23606798,  0.44948974,  0.64575131],         [ 0.82842712,  0.        ,  0.16227766,  0.31662479]],        [[ 0.46410162,  0.60555128,  0.74165739,  0.87298335],         [ 0.        ,  0.12310563,  0.24264069,  0.35889894],         [ 0.47213595,  0.58257569,  0.69041576,  0.79583152]]]), array([[[ 0.,  1.,  1.,  1.],         [ 2.,  2.,  2.,  2.],         [ 2.,  3.,  3.,  3.]],        [[ 3.,  3.,  3.,  3.],         [ 4.,  4.,  4.,  4.],         [ 4.,  4.,  4.,  4.]]]))

7.3 NumPy二元函数

a = np.arange(24).reshape((2,3,4))b = np.sqrt(a)aOut[72]:array([[[ 0,  1,  2,  3],        [ 4,  5,  6,  7],        [ 8,  9, 10, 11]],       [[12, 13, 14, 15],        [16, 17, 18, 19],        [20, 21, 22, 23]]])bOut[73]:array([[[ 0.        ,  1.        ,  1.41421356,  1.73205081],        [ 2.        ,  2.23606798,  2.44948974,  2.64575131],        [ 2.82842712,  3.        ,  3.16227766,  3.31662479]],       [[ 3.46410162,  3.60555128,  3.74165739,  3.87298335],        [ 4.        ,  4.12310563,  4.24264069,  4.35889894],        [ 4.47213595,  4.58257569,  4.69041576,  4.79583152]]])np.maximum(a,b)Out[74]:array([[[  0.,   1.,   2.,   3.],        [  4.,   5.,   6.,   7.],        [  8.,   9.,  10.,  11.]],       [[ 12.,  13.,  14.,  15.],        [ 16.,  17.,  18.,  19.],        [ 20.,  21.,  22.,  23.]]])a > bOut[75]:array([[[False, False,  True,  True],        [ True,  True,  True,  True],        [ True,  True,  True,  True]],       [[ True,  True,  True,  True],        [ True,  True,  True,  True],        [ True,  True,  True,  True]]], dtype=bool)

8. numPy的统计函数


import numpy as npa = np.arange(15).reshape(3,5)aOut[13]:array([[ 0,  1,  2,  3,  4],       [ 5,  6,  7,  8,  9],       [10, 11, 12, 13, 14]])np.sum(a)Out[14]: 105np.mean(a)Out[15]: 7.0np.mean(a,axis=0)Out[16]: array([ 5.,  6.,  7.,  8.,  9.])np.mean(a,axis=1)Out[17]: array([  2.,   7.,  12.])np.average(a,axis=0,weights=[10,5,1])Out[18]: array([ 2.1875,  3.1875,  4.1875,  5.1875,  6.1875])np.std(a)Out[19]: 4.3204937989385739np.var(a)Out[20]: 18.666666666666668

b = np.arange(15,0,-1).reshape(3,5)bOut[23]:array([[15, 14, 13, 12, 11],       [10,  9,  8,  7,  6],       [ 5,  4,  3,  2,  1]])np.max(b)Out[24]: 15np.argmax(b)     #扁平化后的下标Out[25]: 0np.unravel_index(np.argmax(b),b.shape)     #重塑成多维下标Out[26]: (0, 0)np.ptp(b)Out[27]: 14np.median(b)Out[28]: 8.0