Python 学习 第十一篇:numpy

numpy是Python中的基础模块,类型ndarray定义了一个具备矢量算术运算的多维数组,无需编写循环,就能对整个数组进行批量运算。一般状况下,导入numpy,设置别名为np。html

import numpy as np 

一,建立多维数组

ndarray是N-Dimension-Array的简称,该对象是一个快速而灵活的大数据集容器,该容器中存储的元素的数据类型都是相同的。算法

建立矩阵的方法有array()、arange()、ones函数和zeros函数,array()是一个函数,用于建立ndarray类型的对象。数组

1,使用array()函数建立数组dom

使用array()函数建立数组,可使用type()函数查看对象的类型:函数

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

经过array()函数,使用列表建立的是一维数组,使用嵌套的列表建立的是多维数组。学习

2,使用arange()函数建立矩阵大数据

经过arange()函数建立矩阵,arange相似于Python的内置函数range,但返回的是一个ndarray,而不是列表。spa

函数的参数分别是:start、end和step,code

a = np.arange(10) #default start=0, end=10(exclude 10),step=1
# [0 1 2 3 4 5 6 7 8 9]
a1 = np.arange(5,10) # start=5, end=10(exclude=10),step=1
# [5 6 7 8 9]
a2 = np.arange(5,20,2) # start=5, end=20(exclude 20),step=2
#[ 5  7  9 11 13 15 17 19]

3,使用ones(),zeros()和eye()函数建立数组orm

使用ones()建立元素都为1的数组,使用zeros()函数建立元素都是0的数组,参数是表示数组形状shape的元组,表示的是数组各个维度的元素数量。最简单的二维数组的shape元组是(row_num, column_num) ,它表示数组的行数量和列数量。

>>> a=np.ones(3);
array([ 1.,  1.,  1.])
>>> b=np.ones((3,2));
array([[ 1.,  1.],
       [ 1.,  1.],
       [ 1.,  1.]])

>>> c=np.zeros(3)
array([ 0.,  0.,  0.])
>>> d=np.zeros((2,3));   
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])

eye()建立一个正方形的NxN的单位矩阵,对角线的元素值是1,其他元素值是0

二,数组的属性

数组对象的属性主要有:

  • dtype:描述数组元素的类型
  • shape:以tuple表示的数组形状
  • ndim:数组的维度
  • size:数组中元素的个数

1,dtype对象

dtype是一个特殊的对象,它表示数组元素的类型。

2,shape对象

以元组形式表示一个数组的维度

3,ndim对象

数组各个维度的元素数量

三,索引和切片

ndarray对象的元素能够经过索引或切片来访问和修改,索引基于0。

1,数组的索引

一维数组很简单,从表面上看,一维数组的索引跟Python列表的功能差很少。

arr = np.arange(10)

arr[index]
arr[start:end]
arr[start:end:step]

在一个二维数组中,各索引位置上的元素再也不是标量,而是一维数组。

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

>>> arr2d[2]
# array([7,8,9])
>>> arr2d[0][2]
#3
>>> arr2d[0,2]
#3

对于更高维度的数组,一个中括号表示一个维度,索引的使用依此类推。

2,数组的切片

数组切片是原始数组的视图,修改切片中的原始,会直接修改原始数据。数组的切片是Python基本切片的概念从一维到N维的扩展,经过中括号,start,stop和step参数提供给内置函数的slice函数来构造一个Python slice对象,此slice对象被传递给数组来提取数组的一部分。

获取切片的格式是[start:end:step],若是省略start,使用start的默认值0;若是省略end,那么end的默认值是:维度长度-1;若是省略step,使用step的默认值1。一般状况下,数组的切片是[start:end],这就意味着使用step的默认值1。

对于一维数组,数组切片上的任何修改都会直接修改原始数组:

arr = np.arange(10)
arr_slice=arr[5:8]
arr_slice[1]=111
#arr=array([0,1,2,3,4,5,111,7,8,9])

arr_slice[:]=222
#arr=array([0,1,2,3,4,222,222,222,8,9])

对于二维数组,一个中括号表示一个维度,依此类推。

四,数组的操做

numpy模块内置的函数可以对数组进行复杂而高效的操做。

1,排序sort

sort(axis,kind)函数用于对数组进行排序,axis指定排序的轴;kind指定排序算法,默认的排序算法是快速排序,np.sort()返回的是数组的已排序的副本,而就是排序则会修改数组自己。

arr.sort()
arr_sort=np.sort(arr)

2,argsort()函数

argsort()函数返回的是按照数组值从小到大的索引值,即返回的是索引值,索引值是按照元素值从小到大获得的。

x=np.array([1,4,3,-1,6,9])
y=np.argsort(x)
#output
array([3, 0, 2, 1, 4, 5], dtype=int64)

元素-1的值是最小的,其索引是3,所以,argsort()的返回列表中是第一个item。

argsort()函数是将x中的元素从小到大排列提取其对应的index(索引),而后输出到y,按照降序排序:

y=np.argsort(-x)

按照升序排序:

y=np.argsort(x)

3,vectorize 向量化

numpy.vectorize()函数定义一个向量化函数,它以序列或numpy数组做为输入,对numpy数组作向量化操做。函数输出的数据类型是由otypes参数肯定的,若是otypes=None,那么输出的数据类型是经过使用输入的第一个元素调用函数来肯定的,该函数返回一个函数对象。

numpy.vectorize(pyfunc, otypes=None, doc=None, excluded=None, cache=False, signature=None)

参数注释:

  • pyfunc:函数对象
  • otype:输出数据的类型(putput data type)

使用vectorize()定义一个向量化函数,对数组作向量化操做:

def myfunc(a, b):
    return a-b if a>b else a+b

vfunc = np.vectorize(myfunc)
vfunc([1, 2, 3, 4], 2)
#output array([3, 4, 1, 2])

4,tolost

tolost()函数用于把一个矩阵转化为list列表

5,reshap

reshap(array,newshape) :返回一个给定shape的数组的副本,例如,下面的代码把一个一维数组转换为4行2列的二位数组:

a=np.arange(8)
np.reshape(a,(4,2))

6,flatten

返回展平数组,原数组不改变

a=np.arange(8)
b=np.reshape(a,(4,2))
b.flatten()

五,随机数生成

numpy.random模块是对Python内置的random的升级,增长了一些用于搞笑生成多种几率分布的样本值的函数。

经常使用的numpy.random模块的函数:

  • seed:肯定随机数生成器的种子
  • permutation:返回一个序列的随机排列
  • shuffle:对一个序列就地进行随机排列
  • rand:产生均匀分布的样本值
  • randint:从给定的上下限范围内随机选取正数
  • randn:产生标准正态分布
  • binomial:产生二项分布的样本值
  • normal:产生高斯正态分布的样本值
  • beta:产生Beta分布的样本值
  • chisquare:产生卡方分布的样本值
  • gamma:产生伽马分布的样本值
  • uniform:产生在[0,1]范围中均匀分布的样本值

例如,使用normal获得一个标准正态分布的4x4样本数组:

samples=np.random.normal(size=(4,4))

 

 

参考文档:

Python NumPy学习总结

相关文章
相关标签/搜索