numpy库概述
提供了一个ndarry对象:ndarry是存储单一数据类型的多维数组 。
ndarray数组操作
ndarray概述
N维数组对象ndarray是用于存放同类型元素的多维数组。 ndarray中的每一个元素在内存中都有相同存储大小的区域。 ndarray中的每个元素是数据类型对象的对象(称为dtype)。 与python中的其他容器对象一样,可以通过对数组进行索引或切片。 可通过ndarray的方法和属性来访问和修改ndarray的内容。
ndarray创建数组
array函数。
他接受一切序列型的对象,然后产生一个含有传入数据的numpy数组。其中,嵌套序列(比如有一组的等长列表组成的列表)将会被转换为一个多维数组。
numpy. array( object , dtype = None , copy = True , order = None , subok = False , ndmin = 0 )
名称 描述 object 数组或嵌套的数列 dtype 数组元素的数据类型,可选 copy 对象是否需要复制,可选 order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认) subok 默认返回一个与基类类型一致的数组 ndmin 指定生成数组的最小维度
import numpy as np
a = [ 1 , 2 , 3 , 4 ]
b = np. array( a)
print ( b)
c = np. array( [ [ 1 , 2 ] , [ 3 , 4 ] ] )
print ( c)
[ [ 1 2 ]
[ 3 4 ] ]
zero和ones
ones = np. ones( ( 3 , 3 ) , dtype= 'int' )
print ( ones)
[ [ 1 1 1 ]
[ 1 1 1 ]
[ 1 1 1 ] ]
zeros = np. zeros( 3 , dtype= 'int' )
print ( zeros)
empty
import numpy as np
print ( np. zeros( 3 ) )
print ( np. ones( 2 ) )
print ( np. zeros( ( 3 , 3 ) ) )
[ [ 0 . 0 . 0 . ]
[ 0 . 0 . 0 . ]
[ 0 . 0 . 0 . ] ]
print ( np. ones( ( 3 , 2 ) ) )
[ [ 1 . 1 . ]
[ 1 . 1 . ]
[ 1 . 1 . ] ]
print ( np. empty( ( 2 , 3 ) , dtype= int ) )
[ [ 6619222 7536754 7274601 ]
[ 110 0 0 ] ]
单位矩阵identity()
print ( np. identity( 3 ) )
[ [ 1 . 0 . 0 . ]
[ 0 . 1 . 0 . ]
[ 0 . 0 . 1 . ] ]
随机数组
均匀分布
np.random.rand(10,10) 创建指定形状(10*10)的数组(范围在0到1之间) np.random.uniform(0,100) 创建指定范围内的一个数 np.random.randint(0,100) 创建指定范围内的一个整数
正态分布
np.random.normal(1.75,0.1,(2,3)) 给定均值/标准差/维度的正态分布
import numpy as np
print ( np. random. randint( 0 , 50 , 5 ) )
print ( np. random. randint( 0 , 50 , ( 3 , 5 ) ) )
[ [ 5 46 10 49 13 ]
[ 11 25 25 28 1 ]
[ 0 7 3 35 11 ] ]
print ( np. random. rand( 3 , 3 ) )
[ [ 0.58630376 0.8965535 0.33188688 ]
[ 0.9478087 0.86305796 0.12916692 ]
[ 0.79755139 0.76385636 0.61020787 ] ]
print ( np. random. standard_normal( ( 5 , 3 ) ) )
[ [ 0.72473252 - 0.7599206 1.13919464 ]
[ 0.92991417 - 1.57710405 - 0.03130133 ]
[ - 1.78335371 - 1.04393439 1.25677991 ]
[ - 1.04369886 - 0.9520803 - 0.24479149 ]
[ 1.48360519 - 0.18533074 0.94197777 ] ]
ndarray数组属性
用法 说明 b.size 数组元素个数 b.shape 数组形状 b.ndim 数组维度 b.dytpe 数组元素类型 b.itemsize 数组元素字节大小 b.reshape(n,m) 改变数组的形状为n*m
数组和标量之间的运算
数组很重要,它可以使我们不用编写循环即可对数据执行批量运算,这通常叫做矢量化。大小相等的数组之间的任何算数运算都会将运算应用到元素级。同样,数组和标量之间的算术运算也会将那个标量值传播到各个元素。 多维数组和数字的四则运算会作用在数组中的每个元素上,这在 numpy 中被称为 广播(Broadcasting). 用列表就必须用到循环,而numpy 中的矢量化操作把内部循环委托给高度优化的 C 和 Fortran 函数,从而实现更清晰,更快速的 Python 代码。
import numpy as np
arr = np. array( [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ] )
print ( arr)
[ [ 1 2 3 ]
[ 4 5 6 ] ]
a = 1 / arr
print ( a)
[ [ 1 . 0.5 0.33333333 ]
[ 0.25 0.2 0.16666667 ] ]
b = arr - arr
print ( b)
[ [ 0 0 0 ]
[ 0 0 0 ] ]
c = arr * arr
print ( c)
[ [ 0 0 0 ]
[ 0 0 0 ] ]
d = arr ** 0.5
print ( d)
[ [ 1 . 1.41421356 1.73205081 ]
[ 2 . 2.23606798 2.44948974 ] ]
基本索引和切片
一维数组索引和切片
选取数据子集或单个元素的方式很多 一维数组很简单,从表面上看,他们跟python列表的功能差不多 一维数组跟列表最重要的区别在于,数组切片是原始数组的视图。这意味着数据不会被复制,数组视图上的任何修改都会直接反映在原始数组上。 将一个标量值赋值给一个切片时,该值会自动传播到整个选区。
import numpy as np
arr= np. arange( 10 )
print ( arr)
print ( arr[ 5 ] )
print ( arr[ 5 : 8 ] )
arr[ 5 : 8 ] = 12
print ( arr)
arr_slice = arr[ 5 : 8 ]
arr_slice[ 1 ] = 12345
print ( arr)
arr_slice[ : ] = 65
print ( arr)
二维数组索引和切片
普通索引
在二维数组中,各索引位置的元素不再是标量而是一维数组 可以对各个元素进行递归访问,但是这样有点麻烦 还有一种方式是传入一个以逗号隔开的索引列表来选取单个元素 在多维数组中,如果省略了后面的索引,则返回对象会是一个维度低一点的ndarray
import numpy as np
arr3d = np. array( [ [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ] , [ [ 7 , 8 , 9 ] , [ 10 , 11 , 12 ] ] ] )
print ( arr3d)
[ [ [ 1 2 3 ]
[ 4 5 6 ] ]
[ [ 7 8 9 ]
[ 10 11 12 ] ] ]
print ( arr3d[ 0 ] )
[ [ 1 2 3 ]
[ 4 5 6 ] ]
print ( arr3d[ 0 , 1 ] )
print ( arr3d[ 0 ] [ 1 ] )
布尔索引
示例: 大于 3 的元素位置值为 True,小于等于 3 的元素位置值为 False。而这个布尔类型的数组就是布尔索引,通过它可以筛选出值为 True 位置的元素。
data = np. array( [ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] ] )
print ( data > 3 )
[ [ False False ]
[ False True ]
[ True True ] ]
当使用布尔索引获取子数组时,跟列表有点不同:
区别:数组中and 改用 &,or 改用 |,not 改用 ~,并且每个条件要用括号括起来。
import numpy as np
data = np. array( [ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] ] )
print ( data[ ( data > 3 ) & ( data < 5 ) ] )
print ( data[ ( data > 3 ) | ( data < 2 ) ] )
print ( data[ ( data > 3 ) | ~ ( data < 2 ) ] )
数组统计方法
可以通过数组上的一组数学函数对蒸鹅数组或者某个轴向的数据进行统计计算 调用方法:data.sum()
或 np.sum(data)
方法 说明 sum 对数组中全部或某轴向的元素求和。零长度的数组的sum为0 mean 算数平均数。零长度的数组的mean为NaN std,var 分别为标准差和方差,自由度可以调(默认为n) min,max 最大值和最小值 argmin,argmax 分别为最大和最小元素的索引 cumsum 所有元素的累加 cumprod 所有元素的累积 ptp 求极差,即最大值和最小值的差值 median 求中位数,调用方法只可以 用np.median(data)
import numpy as np
a= np. random. randint( 1 , 9 , 9 ) . reshape( ( 3 , 3 ) )
print ( a)
[ [ 8 6 3 ]
[ 7 6 3 ]
[ 8 1 4 ] ]
print ( a. sum ( axis= 0 ) )
print ( a. cumsum( axis= 0 ) )
[ [ 8 6 3 ]
[ 15 12 6 ]
[ 23 13 10 ] ]
二维数组的通用操作:axis
axis:轴,轴和维度的概念是类似的,一维数组有 1 个轴,二维数组有 2 个轴,三维数组有 3 个轴等等。 在一维数组中,axis=0 就代表着它唯一的轴(一般是用不到的); 二维数组中 axis=0 和 axis=1 代表其中的行轴和列轴; 在三维数组中,axis=0、axis=1 和 axis=2 分别代表对应的三条轴。
数组中的实用方法:
arange()方法
numpy 中的 arange() 方法和 Python 中的 range() 用法类似,不同之处在于 arange() 方法生成的是数组,而 range() 方法生成的是 range 类型的序列。
随即方法
np.random.rand() ===类似于===>
random.random() :生成 [0, 1) 之间的随机小数 参数为生成数组的形状。
print ( np. random. rand( ) )
print ( np. random. rand( 3 ) )
print ( np. random. rand( 2 , 3 ) )
np.random.randint() ===类似于===>
random.randint()
注意: np.random.randint(m, n)是左闭又开np.random.randint() 方法第三个参数支持传入生成的数组的形状
print ( np. random. randint( 0 , 5 ) )
print ( np. random. randint( 0 , 5 , 3 ) )
print ( np. random. randint( 0 , 5 , ( 2 , 3 ) ) )
genfromtxt()方法:文件读取
genfromtxt() 方法的返回值是一个多维数组
data = np. genfromtxt( 'data.csv' , delimiter= ',' , dtype= None , encoding= 'utf8' )
delimiter参数:分隔符 dtype 参数:因为 genfromtxt() 方法默认会将数组元素的类型转为浮点数,因为我们 csv 里面有字符串还有浮点数,如果转成浮点数,城市名等字符串元素会出错。所以将 dtype 设为 None,NumPy 会自行选择合适的类型,作为数组元素的类型(这里是字符串类型); encoding 参数:它是为了指定编码的方式,因为 csv 里有中文字符,所以一般都将编码设为 utf8。
其他
方法 说明 np.insert(arr,obj,values,axis)
给数组插入值,四个参数为:(数组,索引,要插入的值,轴)。需要注意的是 return 值返回的是插入后的新数组,不会修改原数组。 np.delate(arr,obj,axis)
删除数组中的元素,参数:(数组,索引轴)。 np.unique()
np.unique()
方法用于去除数组中的重复项,返回不重复的数据。再加上 return_counts=True
参数,还会额外返回去重后数据出现的次数。np.argsort()
获取排序后的索引,具体方法自行查询 arr.astype()
进行数组元素类型转换,arr为某个数组
numpy矩阵操作
numpy矩阵库(Matrix)
numpy中包含了一个矩阵库 numpy.matlib,该模块中的函数返回的是一个矩阵,而不是ndarray对象。 一个m*n的矩阵是一个由m行(row)n列(column)元素排列成的矩阵阵列。 矩阵里的元素可以是数字、符号或数学式。 Numpy和Matlib不一样,对于多维数组的运算,缺省情况下并不使用矩阵运算,如果你希望对数组进行矩阵运算的话,可以调用ndarray对象相应的函数。
numpy矩阵生成
常规方式生成matrix()
矩阵中的x[0,0]和x[0][0]代表的含义不一样
import numpy as np
x = np. matrix( [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ] )
y = np. matrix( [ 1 , 2 , 3 , 4 , 5 , 6 ] )
print ( x, y, x[ 0 , 0 ] , x[ 0 ] [ 0 ] , sep = '\n\n' )
[ [ 1 2 3 ]
[ 4 5 6 ] ]
[ [ 1 2 3 4 5 6 ] ]
1
[ [ 1 2 3 ] ]
matlib.empty()
语法:
numpy.matlib.enpty(shape,dtype,order)
shape:定义新矩阵性状的整数或整数元组 dtype:可选,数据类型 order:C(行序优先)或者F(列序优先)
import numpy. matlib
import numpy as np
print ( np. matlib. empty( ( 2 , 2 ) , dtype = int ) )
[ [ 6881356 7471202 ]
[ 7471201 5243001 ] ]
numpy.matlib.zeros():元素全为0
numpy.matlib.ones():元素全为1
numpy.matlib.eye()
该函数返回一个矩阵,对角线元素为1,其他位置为零。
语法:
numpy.matlib.eye(n,M,k,dtype)
n:返回矩阵的行数 M:返回矩阵的列数,默认为n k:对角线的索引
import numpy. matlib
import numpy as np
print ( np. matlib. eye( n = 3 , M = 4 , k = 1 , dtype = int ) )
[ [ 0 1 0 0 ]
[ 0 0 1 0 ]
[ 0 0 0 1 ] ]
numpy.matlib.identity()
返回给定大小的单位矩阵 单位矩阵是一个方阵 ,主对角线上的元素全为1,其余都为零
import numpy. matlib
import numpy as np
print ( np. matlib. identity( 3 , dtype = int ) )
[ [ 1 0 0 ]
[ 0 1 0 ]
[ 0 0 1 ] ]
numpy.matlib.rand()
import numpy. matlib
import numpy as np
print ( np. matlib. rand( 3 , 4 ) )
[ [ 0.98469167 0.60934979 0.74185134 0.54811488 ]
[ 0.93386949 0.70868984 0.38646533 0.05972873 ]
[ 0.16865481 0.24159916 0.65534165 0.1395666 ] ]
矩阵常用操作
矩阵和二维数组的相互转换
矩阵总是二维的,而ndarray是一个n维数组。当两个对象的维度一样时,可以互换。
import numpy as np
import numpy. matlib
i = np. matrix( '1,2;3,4' )
print ( i)
[ [ 1 2 ]
[ 3 4 ] ]
j = np. asarray( i)
print ( j)
[ [ 1 2 ]
[ 3 4 ] ]
k = np. asmatrix( j)
print ( k)
[ [ 1 2 ]
[ 3 4 ] ]
用法(x为np.matrix()函数创建) 说明 x.T 转置 x.mean() 平均值 x.sum() 求和 x.argmax() 最大值索引 x.diagonal() 对角线元素
numpy.linalg
numpy.linalg中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西
函数 说明 numpy.diag() 以一维数组的形式返回方阵的对角线(或非对角线)元素,或将一维数组转换为方阵(非对角线元素为0) numpy.dot() 矩阵乘法,点积 numpy.vdot() 两个向量的点积。 如果第一个参数是复数,那么它的共轭复数会用于计算。 如果参数是多维数组,它会被展开。 numpy.inner() 返回一维数组的向量内积。对于更高的维度,它返回最后一个轴上的和的乘积。 numpy.trace() 计算对角线元素之和,即矩阵的迹 numpy.linalg.det() 计算矩阵行列式 numpy.linalg.eig() 计算方阵的特征值和特征向量 numpy.linalg.inv() 计算方阵的逆 numpy.linalg.svd() 计算奇异值分解 numpy.linalg.solve() 解线性方程组Ax=b,其中A为一个方阵 numpy.linalg.lstsq() 计算Ax=b的最小二乘解
import numpy as np
a = np. array( [ [ 1 , 1 , 1 ] , [ 0 , 2 , 5 ] , [ 2 , 5 , - 1 ] ] )
b = np. array( [ 6 , - 4 , 27 ] )
x = np. linalg. solve( a, b)
print ( x)