目录
ndarray对象
arange函数
array函数
random函数
其他创建数组方法
切片和索引及修改数组维度
数组的拼接
数组的分割
数组的转置
数组的运算
numpy(Numerical Python)是科学计算基础库,提供大量科学计算相关功能,比如数据统计,随机数生成等。其提供最核心类型为多维数组类型(naray) ,支持大量的维度数组与矩阵运算,numpy 支持向量处理ndarray对象,提高程序运算速度。安装:pip install numpy
numPy最重要的一个特点是其N维数组对象ndarray,它是一系列同类型数据的集合,以0下标为开始进行集合中元素的索引。
ndarray对象是用于存放同类型元素的多维数组。
ndarray中的每个元素在内存中都有相同存储大小的区域。
ndarray内部由以下内容组成:
- 一个指向数据(内存或内存映射文件中的一块数据)的指针。
- 数据类型或dtype,描述在数组中的固定大小值的格子。
- 一个表示数组形状(shape)的元组,表示各维度大小的元组。
numPy的数组中比较重要ndarray对象属性有:
该函数可以传入一个整数类型的参数n,函数返回值看着像一个列表,其实返回值类型是numpy.ndarray。这是Numpy中特有的数组类型。如果传入arange函数的参数值是n,那么arange,函数会返回0到n-1的ndarray类型的数组。(左闭右开原则),用来创建指定范围数据数组,语法格式:numpy.arange(start, stop, step, dtype)
参数:
- start:起始值,默认为0
- stop : 终止值(不包含,符合左闭右开原则)
- step :步长,默认为1 ,
- dtype : 返回的数据类型,如果没有指定,返回输入时的数据类型
import numpy as np a = np.arange(10) print(a,type(a)) b = np.arange(5, 10, dtype='float', step=2) print(b)
array函数可以生成多维数组。例如,如果要生成一个二维数组,需要向array 函数传递一个列表类型的参数。每一个列表元素是一维的ndarray类型数组,作为二维数组的行。另外,通过ndarray类的shape属性可以获得数组每一维的元素个数(元组形式),也可以通过shape[n]形式获得每一维的元素个数,其中 n是维度,从0开始。语法格式如下:
numpy.array(object, dtype=None, copy= True, order = None, subok =False, ndmin =0)
import numpy as np # 使用array创建一个一维数组,一层[]括号 a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) print(type(a), a) # 打印结果:
[1 2 3 4 5 6 7 8 9] # 使用array创建一个二维数组,两层[]括号 b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(b) # array 的dtype参数使用,指定创建的数组类型是浮点型,默认为整数型 c = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9], dtype='float') print('指定dtype参数创建数组:',c) # array 的ndmin参数使用,指定创建数组的维度 d = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9], ndmin=3) # 创建三维数组 print('指定ndmin参数创建数组:',d)
numpy.random.random(size=None),该方法这回[0.0,1.0)范围的随机数。
numpy.random.randn(d0,d1.....dn),randn函数返回一个或一组具有标准正态分布(期望为0,方差为1)的样本。dn表格每个维度,返回值为指定维度的array。
numpy.random.normal指定期望和方差的正态分布。正态分布(高斯分布),参数:loc-期望;scale-方差;size-形状
import numpy as np # 随机数创建,size的参数决定随机数组的维度及个数,size参数的个数代表其维度 b = np.random.random(size=None) # 创建一个随机数,size参数可以不写或者为None print(b) c = np.random.random(size=(5,)) # 指定创建随机数的个数的一维数组size = num或size = (num,) print(c) # 创建二维数组的随机数,第一个数字表示行数,第二个表示列数 d = np.random.random(size=(2, 4)) print(d) # 创建三维数组的随机数,第一个数字表示组数(几组),第二个表示行数,第三个表示列数(每行具有的数量) e = np.random.random(size=(3, 2, 4)) print(e) # 随机整数 # f = np.random.randint(5) # 同使用import random f = np.random.randint(5, size=6) print(f) g = np.random.randint(5, 10, size=(3, 3)) # 前两个数表示随机数的起始值,不同于import random中的randint(双闭合),numpy为左闭右开 print(g)
import numpy as np def randnTest(): a = np.random.randn(5) print(a) b = np.random.randn(3, 5) print(b) c = np.random.randn(2, 3, 5) print(c) def normalTest(): # 创建指定期望和方差的正态分布 a = np.random.normal(size=3) print(a) b = np.random.normal(loc=2, scale=0.001, size=(3, 4)) print(b)
ndarray数组除了可以使用底层ndarray构造器来创建外,也可以通过以下几种方式来创建。
zeros创建指定大小的数组,数组元素以0来填充。numpy.zeros(shape, dtype = float, order = ‘C’)
a = np.zeros(5, dtype='int') print(a) b = np.zeros((3, 5), dtype='int') print(b)
ones 创建指定形状的数组,数组元素以1来填充。numpy.ones(shape,dtype = None, order = 'C)
c = np.ones((3, 5), dtype='int') print(c)
empty方法用来创建一个指定形状(shape)、数据类型(dtype),且未初始化的数组,里面的元素的值是之前内存的值。多次随机数结果相同,empty参数:
for i in range(3): print(np.empty((3, 4), dtype='int'))
linspace函数用于创建一个一维数组,数组是一个等差数列构成的。np.linspace(start, stop, num=50, endpoint=Tnue, retstep=False, dtype=None)
print(np.linspace(1,20,10))
logspace函数用于创建一个于等比数列。格式如下:
np.logspace(start, stop, num=50, endpoint= True, base=10.0, dtype=None),参数:
ndarray对象的内容可以通过索引或切片来访问和修改,与Python中 list的切片操作一样。ndarray数组可以基于0-n的下标进行索引,并设置start, stop 及 step 参数进行,从原数组中切割出一个新数组。通过切片可以获取到新数组,即使赋值给新的变量,但还是原来数组的视图。如果对切片数组中元素的值,进行修改会影响原来的数组。所以需要是深拷贝的方法:np.copy(),(括号里的参数为要拷贝的内容,可通过索引切片获取)
处理数组的一项重要工作就是改变数组的维度,包含提高数组的维度和降低数组的维度,还包括数组的转置。Numpy提供的大量API可以很轻松地完成这些数组的操作。例如,通过reshape方法可以将一维数组变成二维、 三维或者多维数组。通过ravel方法或fatten方法可以将多维数组变成一维数组。 改变数组的维度还可以直接设覃Numpy数组的shape属性(元组类型),通过resize方法也可以改变数组的维度。
import numpy as np # 改变数组的形状(维度),修改维度时,修改后的数据包含元素与修改的数据个数要相等,如a 12个 ,b 3*4个 ,c 2*2*3个 a = np.arange(12) b = a.reshape((3, 4)) print(b) c = a.reshape((2, 2, 3)) print(c) d = np.reshape(c,(2,6)) print(d) # 将多维数组修改为一维数组 print(d.reshape(-1)) # 切片操作 print(a[::-1]) # 倒置反转 # 切片使用[行进行切片,列进行切片] [start:stop:step,start:stop:step,start:stop:step] print(c[1][1][2]) # 使用方法同list # 通过坐标法获取 print(c[1,1,2]) # 同时获取不同的行和列数据 print(c[(0,0,0),(0,1,1),(1,1,1)])
numpy.concatenate函数用于沿指定轴连接相同形状的两个或多个数组,
numpy.concatenate((al, a2,...), axis),参数说明:
- al, a2,....相同类型的数组
- axis:沿着它连接数组的轴,默认为0,0为垂直,1为水平
import numpy as np a = np.random.randint(1, 6, size=(2, 4)) b = np.random.randint(5, 11, size=(2, 4)) print(a) print(b) c = np.hstack([a, b]) # 水平合并 print(c) d = np.vstack([a, b]) # 垂直合并 print(d) e = np.concatenate((a, b), axis=0) # 0为垂直 print(e) f = np.concatenate((a, b), axis=1) # 1为水平 print(f)
split分隔
numpy.split函数沿特定的轴将数组分割为子数组,格式如下:
numpy.split(ary, indices or _sections, axis),参数说明:
- ary :被分割的数组
- indices_ or_ sctions :如果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置。
- axis:沿着哪个维度进行切向,默认为0,横向切分。为1时,纵向切分。
水平分隔
分隔数组是组合数组的逆过程,与组合数组一样,分隔数组也分为水平分隔数组和垂直分隔数组。水平分隔数组与水平组合数组对应。水平组合数组是将两个或多个数组水平进行收尾相接,而水平分隔数组是将已经水平组合到一起的数组再分开。使用hsplit函数可以水平分隔数组,该函数有两个参数,第1个参数表示待分隔的数组,第2个参数表示要将数组水平分隔成几个小数组。
垂直分隔
垂直分隔數组是垂直组合数组的逆过程。垂直组合數组是将两个或多个数组垂直进行首尾相接,而垂直分隔数组是将已经垂直组合到一起的数组再分开。使用vsplit函数可以垂直分隔数组,该函数有两个参数,第1个参数表示待分隔的数组,第2个参数表示将数组垂直分隔成几个小数组。
二维数组a[i][j] 转置结果a[j][i]
三位数组a[i][j][k] 默认转置结果a[k][j][i]
import numpy as np a = np.random.randint(1, 11, size=(2, 5, 3)) print(a) # 三种转置的方法 print(a.transpose()) print(np.transpose(a)) print(a.T)
算术函数:如果参与运算的两个对象都是ndarray,并且形状相同,则会在相同位置之间进行运算。NumPy算术函数包含简单的加减乘除: add(), subtract(), multiply()和divide()。
数学函数:NumPy提供了标准的三角函数: sin()、 cos()、 tan()
a = np.array([0, 30, 45, 60, 90]) print(np.sin(a * np.pi / 180)) # 通过pi/180转化为弧度
聚合函数:NumPy提供了很多统计函数,用于从数组中查找最小元素,最大元素,百分位标准差中和方差等