什么是numpy

numpy具有如下特点:

  • 使用C语言编写
  • 数据存储在连续数据块上,占据内存少于list
  • 运算速度快,适合结构化数据计算

标准化的numpy导入模式:

  1. import numpy as np

numpy的对象——ndarray

ndarray是numpy使用的重要对象

  1. 属性
    1. shape:量度
    2. dtype:数据类型
  2. 生成

    1. #solution1
    2. arr1=np.array(data1)#data1 is an list type
    3. #all-zeros
    4. arr2=np.zeros(10)
    5. #序列化数组
    6. arr3=np.arange(5)
    7. Out[1]:array([0,1,2,3,4])
    8. #空数组
    9. np.empty((2,3,3))
  3. 数据类型:可以为np.float64/np.int32

    1. 使用astype可以进行显式转换
      1. arr.astype(np.float64)

      numpy的计算

      numpy是一种向量化的计算模式,其规则为
  • 等尺寸的数组之间的算术操作都是逐个元素的,即对应位置的元素相互计算
  • 带标量的计算,会有 广播 的效应,传递给数组的每个元素
  • 同尺寸的数组之间的比较,会产生布尔数值列表

    索引与切片

    基础索引知识

    基础的使用过程中主要注意以下两点:

  • 索引从0开始

  • 切片含左不含右边

另外还需要注意,数组的引用和切片是原数组的视图,这意味着数据没有被复制,对数组切片的值进行改变,原数组的值也会发生变化。 如果需要复制,可以使用 arr[4:9].copy实现。
高维数组的引用中,既可以通过arr2d[0][2],也可以通过arr2d[0,2]实现。
高维数组的切片中,可以通过arr2d[0:2,1]实现切片与索引共同实现

布尔索引

布尔索引可以通过一个同维度数量或更低维度数量的布尔数组完成对原数组的索引。

  1. names=['hhh','ttt','hhh','qqq']
  2. data=np.randomm.randin(4,3)
  3. data[name=="hhh"]
  4. #这里就完成了对hhh所对应的行的索引,最终会输出data的第1、3行

小知识,可以使用~符号取反 例如:cond=names==”hhh” data[~cond]

另外,多重条件设置时,可以用&和|实现

  1. mask=(names=='hhh')|(names=='qqq')
  2. data[mask]

神奇索引

神奇索引是对整数数组进行数据索引的工具,方便对整数索引安卓顺序进行索引。

  1. arr=np.empty((8,4))
  2. for i in range(8):
  3. arr[i]=i
  4. #arr:
  5. array([[0,0,0,0],[1,1,1,1].....)
  6. arr[[4,3,0,6]]#依次取第4,3,0,6
  7. arr[[-3,-5,-7]]#依次取第5,3,1
  8. arr[[1,5,7,2],[0,3,1,2]]#取[1,0]/[5,3]等数

神奇索引的索引结果总是一维的,而且总是将数据复制到一个新的数组

转置与换轴

转置

arr.T是二维数组的常用的转置操作

  1. arr=np.random.randn(6,3)
  2. np.dot(arr.T,arr)#求行列式的值

对于更高维度的数组,需要进行换轴操作

换轴

换轴用于高维数组

  1. arr.transpose((1,0,2))
  2. #即把第一个轴换到第二个,第二个轴换到第一个
  3. eg:
  4. array([[[0,1,2,3],[4,5,6,7]],[[8,9,10,11],[11,12,13,14]]])
  5. arr.transpose((1,0,2))
  6. array([[[0,1,2,3],[8,9,10,11]],[[4,5,6,7],[12,13,14,15]]])

通用函数

简称为ufunc,是在ndarray逐个元素进行操作的函数。

一元通用函数

  • abs、fabs:计算整数、浮点数等的绝对值
  • sqrt:开平方根
  • square:平方
  • exp:自然对数值
  • log、log10、log2,log1p
  • sign:1(正),0(0),-1(负数)
  • ceil:大于x的最小整数
  • floor:小于等于x的最大整数
  • rint:保留到整数位并保留dtype
  • modf:将整数部分和小数部分以数组形式返回
  • isnan:是否为空
  • isinf:是否有限

    二元通用函数

  • add:相加

  • substract:在第二个数组中去除第一个数组包含的元素
  • multilpy:相乘
  • divide:除或整除
  • power:第二个数组作为幂
  • maximum:逐个元素比较最大值
  • copysign:第一个数组的符号修改为第二个的符号

    面向数组的编程

    向量化 是面向数组编程的重要目的之一。
    一些应用:

    条件逻辑np.where

    1. result=[(x if c else y) for x,y,c in zip(xarr,yarr,cond)]
    2. #上述表达式可以完成当c这一布尔判断成立时,取x,不成立时取y的一个结果筛选功能,也可以通过以下方法实现:
    3. result=np.where(cond,xarray,yarr)

    当xarr和yarr被替换为标量时,where语句可以很方便的完成将所有正值替换为1这类工作。

    统计学方法

  • arr.mean()计算平均值,若括号内参数为1则计算列的平均值,为0则计算行的平均值

  • arr.sum()求和
  • arr.mean(axis=1)与直接在括号内写数字恰好相反
  • np.cumsum、np.cumprod累积函数值(求和、求积)

    布尔数值

    主要常用的是any和all两个判断函数
    1. bools=np.array([False,True,Fales])
    2. bools.any()#是否有真
    3. bools.all()#是否全真

    排序

    np.sort()实现,括号内可以传递排序的维度值,返回的是对原数组排序后的结果的拷贝。

    唯一值与其他集合逻辑

    np.unique(names)可以完成一个姓名array的去重操作,得到unique的列表。
    np.in1d(array,[2,3,4,6])可以检查array内部是否有2,3,4,6

    文件输入输出

    主要有保存为npy(未压缩格式)和npz两种格式进行, ``` np.save(‘some.npy’,arr) np.load(‘some.npy’)

np.savez(‘arr.npz’,a=arr,b=arr) np.load(‘arr.npz’)#多个数组将以字典形式打开

  1. <a name="D0bTn"></a>
  2. # 线性代数
  3. 矩阵乘法、分解和行列式等功能可以通过np实现

x.dot(y) x@np.ones(3) np.diag()#方阵的对角元素作为一位数组返回) np.det()#计算行列式 np.inv()#计算逆矩阵 np.eig()#计算特征值和特征向量 ```


end