axis为轴,n维数组有n个轴,axis的取值为1,2,3,4…,n
属性 | 说明 |
---|---|
ndim | 表示数组的维度 |
shape | 表示数组的尺寸,(n,m) |
size | 返回数组的元素总数 |
dtype | 描述数组中元素的类型 |
itemsize | 表示数组的每个元素的大小(以字节为单位) |
arr.astype(‘数组类型’) | 转换数组类型 |
arr.astype(np.数组类型) | 转换数组类型 |
numpy.array(object,dtype=None,copy=True,order='k',subok=False,ndmin=0)
参数名称 | 说明 |
---|---|
object | 接收array,表示想要创建的数组 |
dtype | 接受data-type,表示数组所需的数据类型 |
ndmin | 接受int,指定生成数组应该具有的最小维数 |
import numpy as np
arr1 = np.array([1,2,3,4]) #创建一维数组
arr2 = np.array([[1,2,3],[4,5,6],[7,8,9]]) #创建二维数组
In [6]: print('数组维度为:',arr2.shape)
数组维度为: (3, 3)
In [7]: print('数组类型为:',arr2.dtype)
数组类型为: int32
In [8]: print('数组元素个数为:',arr2.size)
数组元素个数为: 9
In [9]: print('数组元素大小为:',arr2.itemsize)
数组元素大小为: 4
In [10]: np.arange(0,1,0.1)
Out[10]: array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
#创建等差数列,包含终点值
In [14]: np.linspace(0,1,5,endpoint=True, retstep=False, dtype=None)
Out[14]: array([0. , 0.25, 0.5 , 0.75, 1. ])
#创建等比数列,生成5个10^0~10^2等比数
In [18]: np.logspace(0,2,5)
Out[18]:
array([ 1. , 3.16227766, 10. , 31.6227766 ,
100. ])
#创建特殊矩阵
np.zeros((2,3)) #2行3列的0矩阵
np.eye(3) #3行3列的单位矩阵
np.diag([1,2,3,4]) #生成对角矩阵
np.ones((5,3)) #5行3列的1矩阵
可用于作数据预处理
类型 | 描述 |
---|---|
bool | 布尔型 |
inti | 由所在平台决定其精度 |
int8(16、32、64) | 整型 |
uint8(16、32、64) | 无符号整型 |
float(16、32、64) | 浮点数 |
complex(64、128) | 复数 |
函数 | 描述 |
---|---|
np.random.random(n) | n个随机数构成的一维数组 |
np.random.rand(n,m) | 服从均匀分布的n行m列矩阵 |
np.random.randn(n,m) | 服从正态分布的n行m列矩阵 |
np.random.randint(low,high=None,size=None) | 数组尺寸为size,元素范围在low~high的矩阵 |
函数 | 描述 |
---|---|
seed | 随机数种子 |
permutation | 返回序列的一个随机排列或范围 |
Shuffle | 对序列进行随机排序 |
binomial | 产生二项分布的随机数 |
normal | 产生正态分布的随机数 |
beta | 产生beta分布的随机数 |
chisquare | 产生卡方分布的随机数 |
gamma | 产生gamma分布的随机数 |
uniform | 产生在[0,1]中均匀分布的随机数 |
arry[n :m :h] #从n~m-1以h为步长
arry[row,col] #row为行,col为列
arry[[(0,1,2),(1,2,3)]] #索引对应行对应列的元素
arry[1:,(0,2,3)] #索引2、3行对应的023列元素
arr = np.arange(12) #创建一维数组
arr1 = arr.reshapde(3,4)
arr2 = arr1*3
arr3 = np.arange(16).reshape(4,4)
函数 | 描述 |
---|---|
arr.reshape(n,m) | 将一维数组变成n行m列数组,不改变原有数组 |
arr1.ravel()、arr1.flatten() | 横向展平数组 |
arr1.flatten(‘F’) | 纵向展平数组 |
np.hstack((arr1,arr2)) | 两个数组横向组合 |
np.vstack((arr1,arr2)) | 两个数组纵向组合 |
np.concatenate((arr1,arr2),axis=1) | axis为1时横向组合,axis为0时纵向组合 |
np.hsplit(arr3,2) | 横向分割arr3,左右分开 |
np.vsplit(arr3,2) | 纵向分割arr3,上下分开 |
np.split(arr3,2,axis=1) | axis为1时横向分割,axis为0时纵向分割 |
arr.shape=(m,n) | 将数组arr变为(m,n)的数组,改变原有数组 |
如果indices_or_sections是一个整数N,则数组将被分割沿着’轴’进入N个相等的数组
#如果indices_or_sections是一个整数N,则数组将被分割沿着'轴'进入N个相等的数组
import numpy as np
a=np.ones((2,2),dtype='int')
b=np.zeros((2,2),dtype='int')
c=np.concatenate([a,b],axis=0)
c
np.split(c,2,axis=0) #返回的对象其实是子阵列表
#返回的对象其实是子阵列表,因此是可以进行索引操作的
np.split(c,2,axis=0)[0]
如果indices_or_sections是排序整数的1-D数组,则为条目指示数组被分割的“轴”的位置。
#如果indices_or_sections是排序整数的1-D数组,则为条目指示数组被分割的“轴”的位置。
d=np.array([[1, 1],
[1, 1],
[2, 2],
[2, 2],
[3, 3],
[3, 3],
[4, 4],
[4, 4]])
np.split(d,[5],axis=0)
#将数组切分成三份(两到三段)
np.split(d,[3,6],axis=0) #注意这里不要写切片的冒号
#将数组切分成四份(三刀四段)
np.split(d,[2,4,6],axis=0)
简单赋值不会创建数组对象或其数据的拷贝。
In [8]: a = np.arange(6)
In [9]: b = a
In [10]: id(a),id(b)
Out[10]: (2562742930128, 2562742930128)
a.view()
In [14]: a = np.arange(0, 12, 1).reshape(6, 2)^M
...: c = a.view()
In [15]: id(a),id(c)
Out[15]: (2562742848848, 2562743600592)
新数组数据更改后,会影响原始数据。类似于原生python中的浅复制:
In [16]: a[0,1]=11^M
...: ^M
...: a^M
...: c #c = a.view()
Out[16]:
array([[ 0, 11],
[ 2, 3],
[ 4, 5],
[ 6, 7],
[ 8, 9],
[10, 11]])
也可以通过.copy()方法创建一个副本,类似于原生python的深复制。
import numpy
a = np.random.randint(2, size=(3, 4)) # 二维数组
b = a.copy()
a
b
id(a),id(b)
a[0, 0]= 8888
a
b
函数 | 描述 |
---|---|
np.mat(‘1 2 3;4 5 6;7 8 9’) | 创建矩阵 |
np.matrix([[1,2,3],[4,5,6],[7,8,9]]) | 创建矩阵 |
np.bmat(‘arr1 arr2;arr2 arr1’) | 分块矩阵组合 |
import numpy as np
matr1 = np.mat('1 2 3;4 5 6; 7 8 9')
matr2 = matr1*3 #矩阵与数相乘
matr1+matr2 | 矩阵相加 |
---|---|
matr1-matr2 | 矩阵相减 |
matr1*matr2 | 矩阵相乘 |
np.multiply(matr1,matr2) | 矩阵对应元素相乘 |
c = np.array( [[1,1], [0,1]] )
d = np.array( [[2,0], [3,4]] )
c.dot(d)
np.dot(c,d)
array([[5, 4],
[3, 4]])
属性 | 说明 |
---|---|
T | 返回自身的转置 |
H | 返回自身的共轭转置 |
I | 返回自身的逆矩阵 |
A | 返回自身数据的二维数组的视图 |
matr1 = np.mat("1 2 3;4 5 6;7 8 9")
In [15]: matr1.T
Out[15]:
matrix([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]])
基本函数运算
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0oKCXBbp-1577094608504)(F:\python\笔记\(0)AI学习\图片\numpy(1).png)]
广播指不同形状的数组之间执行算术运算的方式。(一维数组加二维数组)
In [1]: import numpy as np
In [2]: arr1 = np.array([[0,0,0],[1,1,1],[2,2,2],[3,3,3]])
In [3]: arr2 = np.array([1,2,3])
In [4]: arr1+arr2
Out[4]:
array([[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 6]])
In [18]: arr1 = np.array([[0,0,0],[1,1,1],[2,2,2],[3,3,3]])
In [19]: arr3 = np.array([1,2,3,4]).reshape((4,1))
In [20]: arr1+arr3
Out[20]:
array([[1, 1, 1],
[3, 3, 3],
[5, 5, 5],
[7, 7, 7]])
####广播规则
规则1:如果两个数组的维度数不相同,那么小维度数组的形状将会补齐
import numpy as np
np.ones((3,3))+np.arange(3)
np.ones((3,3))+np.ones((3,1))
np.ones((3,3))+np.ones((2,3))##会报错
规则2:如果两个数组的形状在任何一个维度都不匹配,数组的形状会沿着维度为1的维度扩展,以匹配另外一个数组形状。
np.arange(3).reshape(3,1)+np.arange(3)
规则3:如果两个数组的形状在任何一个维度上都不匹配并且没有任何一个维度等于1,会广播错误。
##会报错
np.arange(3).reshape(3,2)
np.arange(3)
np.arange(3).reshape(3,2)+np.arange(3)
1、frompyfunc 函数
frompyfunc(func,nin,nout)
ufunc
)对象。)
2、vectorize 函数
np.vectorize([‘pyfunc’,‘otypes = None’)
def fun(x,y):
if x>y:
return 1
else:
return 2
a=np.array([1,12,5,6,7,9])
b=np.array([5,6,7,8,9,12])
fun_array = np.vectorize(fun,otypes=[float]) #这里只是将上一节的np.frompyfunc改成np.vectorize
fun_array(a,b)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-akj3sHXx-1577094608509)(F:\python\笔记\(0)AI学习\图片\numpy(2).png)]
In [3]: import numpy as np
In [4]: a=np.array([1,2,3])^M
...: b=np.array([True,False,True])^M
...: ^M
...: a[b]
Out[4]: array([1, 3])
In [5]: np.random.seed(0)
...: a=np.random.randint(10,size=(3,3))
...: a
...: a>5
...: a[a>5]
Out[5]: array([7, 9])
文件的读/写主要有二进制的文件读/写和文件列表形式的数据读/写两种形式。
函数 | 说明 |
---|---|
np.save(file_path,arr,allow_pickle=True,fix_imports=True) | 以二进制的格式保存数据 |
np.savez(file_path,arr1,arr2) | 多个数组存储 |
np.load(“file_path.npy”) | 读取单个数组的文件 |
np.load(“file_path.npz”) | 读取多个数组的文件 |
函数 | 说明 |
---|---|
np.savetxt(fname,X,fmt=’%.18e’,delimiter=’ ,’,mewline=’\n’,header=’’,footer=’’,comments=’#’) | 保存为文本文件 |
np.loadtxt(‘file_path’,delimiter=’,’) | 读入文件 |
np.genfromtxt(file_path,delimiter=’,’) | 读取,输出一组结构化数据 |
函数 | 说明 |
---|---|
arr.sort() | 直接排序 |
arr.sort(axis=1) | 1为横轴排序,0为纵轴排序 |
arr.argsort() | 返回排序后值对应的下标 |
np.lexsort((a,b,c)) | a,b,c为数组,多个键值排序时,按照最后一个传入的数组进行排序 |
np.unique() | 去重 |
np.tile(arr,n) | 将arr数组重复n次 |
np.repeat(arr,n,axis=None) | 将arr数组重复n次,axis指沿哪个轴进行重复 |
tile函数是对数组进行重复操作,repeat函数是对数组中的每个元素进行重复操作
import numpy as np
arr = np.array([2,3,6,8,0,7])
print(arr.argsort())
a = np.array([3,2,6,4,5])
b = np.array([50,30,40,20,10])
c = np.array([400,300,600,100,200])
d = np.lexsort((a,b,c))
print(list(zip(a[d],b[d],c[d])))
#输出结果
[4 0 1 2 5 3]
[(4, 20, 100), (5, 10, 200), (2, 30, 300), (3, 50, 400), (6, 40, 600)]
方法 | 说明 |
---|---|
unique(x) | 计算x中的唯一元素,并返回有序结果 |
intersect1d(x,y) | 计算x和y的公共元素,并返回有序结果。 |
union1d(x,y) | 计算x和y的并集,并返回有序结果。 |
in1d(x,y) | 得到一个表示“x的元素是否包含于y”的布尔型数组。 |
setdiff1d(x,y) | 集合的差,即元素在x中且不在y中。 |
setxor1d(x,y) | 集合的对称性,即存在于一个数组中但不同时存在于两个数组中的元素 |
np.sum(arr) | 计算数组的和 |
---|---|
arr.sum(axis=0) | 0代表沿纵轴求和,1代表沿横轴求和 |
np.mean(arr) | 计算数组的均值 |
arr.mean(axis=0) | 0代表沿纵轴求均值,1代表沿横轴求均值 |
np.std(arr) | 计算数组标准差 |
np.var(arr) | 计算数组方差 |
np.max(arr) | 计算数组最大值 |
np.min(arr) | 计算数组最小值 |
np.argmin(arr) | 返回数组最小元素的索引 |
np.argmax(arr) | 返回数组最大元素的索引 |
np.cumsum(arr) | 计算所有元素的累计和 |
np.cumprod(arr) | 计算所有元素的累计积 |
>>> arr = np.arange(2,10)
>>> np.cumsum(arr)
array([ 2, 5, 9, 14, 20, 27, 35, 44], dtype=int32)
>>> np.cumprod(arr)
array([ 2, 6, 24, 120, 720, 5040, 40320, 362880],dtype=int32)
np.max(arr) | 计算数组最大值 |
| np.min(arr) | 计算数组最小值 |
| np.argmin(arr) | 返回数组最小元素的索引 |
| np.argmax(arr) | 返回数组最大元素的索引 |
| np.cumsum(arr) | 计算所有元素的累计和 |
| np.cumprod(arr) | 计算所有元素的累计积 |
>>> arr = np.arange(2,10)
>>> np.cumsum(arr)
array([ 2, 5, 9, 14, 20, 27, 35, 44], dtype=int32)
>>> np.cumprod(arr)
array([ 2, 6, 24, 120, 720, 5040, 40320, 362880],dtype=int32)