多维性(0维为标量,1维为向量(一维数组),2维为矩阵(二维数组),等等等等)

同质性(所有元素其类型一致)

高效性(基于连续内存块存储,支持向量化运算)

属性

import numpy as np
arr=np.array(5) #创建了一个0维数组
# arr=np.array([1,2,3]) #创建了一个1维数组
print(arr.ndim)# 输出数组维度

arr1=np.array(5,'kkk')#同质性,5会以字符串形式输出,不同的数据类型会被强制转换为相同的数据类型
print(arr1)

print(arr.shape) #输出数组的行,列
print(arr.size)  #输出数组的元素总数
print(arr.dtype) #输出数组内的元素类型

此时并不会强转为相同的数据类型

方法

1,基础构造

方法:array,copy

#arr=np.array([1,2,3])
arr=np.array([[0,0,0],[1,3,2]])
arr=arr.T #矩阵转置
print(arr)
print(arr.shape)
print(arr.ndim)
print(arr.size)
print(arr.dtype)
# arr=np.array([1,2,3])#array内部传入参数为列表
lt=[1,2,3]
arr=np.array(lt,dtype=int)
print(arr)
arr1=np.copy(arr)
print(arr1) #复制数组,产生一个新数组

2,预定义形状填充

方法:zeros,ones,empty,full,zeros_like等

#全0
arr=np.zeros((3,4),dtype=int)
# np.zeros_like(array,dtype=int) 形状和array一样,但是内部填充值全为0
# print(arr)
#全1
arr1=np.ones((3,4),dtype=int)
# np.ones_like(array,dtype=int) 同上
# print(arr1)
#未初始化,全随机值
arr2=np.empty((9,4))
# np.empty_like() 同上
# print(arr2)
#预定值
arr3=np.full((3,4),999)
# np.full_like(arr,999) 同上
print(arr3)

3,基于数值范围生成

方法:arange,linspace,logspace

#基于数值范围生成
#等差数列
"""
def arange(start_or_stop: ,stop:step:  None = 1,dtype: device: None = None,like:)
"""
#这里依旧是左闭右开区间
arr=np.arange(5) #第一个参数即终止,步长在缺省情况下为1
# arr= np.arange(1,10,2,dtype=int) #起始,终止,步长
print(arr)


arr=np.linspace(0,10,5) #1到10之间取多少份,左闭右闭,等间隔取
print(arr)


#对数间隔数列
arr=np.logspace(0,4,2,base=2) #初始(不可代表终止),终止,取多少份,对数的底数,默认为10
print(arr)

4,特殊矩阵生成

方法:eye,diag,rand

#特殊矩阵构造
#单位矩阵构造
# arr=np.eye(5,6,dtype=int)
arr=np.eye(5)
print(arr)



#对角矩阵构造
arr=np.diag([1,2,3]) #输入主对角线上的数字
print(arr)

5,随机数组生成

方法:random.rand(),random.uniform(),random.randint(),random.randn(),random.seed()

#随机数组生成
#生成0到1之间的随机浮点数
arr=np.random.rand(3,4)
print(arr)


#生成指定范围区间的随机浮点数
arr=np.random.uniform(3,6,(3,4))
print(arr)


#生成指定范围区间的随机整数
arr=np.random.randint(3,6,(3,4))
print(arr)


# 生成随机数列(正态分布)(-3,3)
arr=np.random.randn(2,3)
print(arr)


#设置随机种子
np.random.seed(20)
arr=np.random.randint(1,6,(2,5))
print(arr)


arr=np.array([1,2,0,1,-1],dtype=np.int8)
print(arr)

数据类型

索引与切片

#索引与切片
#一维数组
arr=np.random.randint(1,100,20,dtype=int)
print(arr)


print(arr[0])
print(arr[:])# 获取全部数据
print(arr[2:3])#还是含左不含右
print(arr[slice(2,15,3)])#切片方法,与上面等价,最后一个参数填步长
print(arr[(arr <= 50) & (arr >= 10)]) #布尔索引


#二维数组
arr=np.random.randint(1,100,(4,8))
#[行][列]
print(arr)



#玩切片时时刻记住,前行后列

# print(arr[0],"\n")  #获取到了单行
# print(arr[][0],"\n")

# print(arr[0][0],"\n")#获取到了单个数据
# print(arr[0,0],"\n")#也是获取到单个数据

# print(arr[:],"\n")# 获取全部数据
# print(arr[:,:],"\n")#也是原样输出
# print(arr[0:2],"\n")#输出0到1行
# print(arr[0:2,],"\n")#输出效果和上面一样

# print(arr[0:,:3],"\n")#输出第0行到最后1行,第0列到第2列
# print(arr[1,:],"\n")#输出第一行,所有列
# print(arr[1:2,2:5],"\n") #输出了一个二维数组
# print(arr[1,2:5],"\n") #输出的结果是一维数组

## print(arr[2:3],"\n")#还是含左不含右
## print(arr[slice(2,15,3)],"\n")#切片方法,与上面等价,最后一个参数填步长
# print(arr[(arr <= 50) & (arr >= 10)],"\n") #布尔索引,结果用一维数组表示


# print(arr[arr>50]) #布尔索引,结果用一维数组表示
print(arr[2] [arr[2]>50])# 二维数组使用布尔索引嵌套即可,过滤行数据
print(arr[:,3] [arr[:,3]<50])# 二维数组使用布尔索引嵌套即可,过滤列数据
#规律:先获取一行或者一列的数据,然后在后面放上中括号,放上过滤条件

ndarray的运算,广播机制

#ndarray运算
arr1=np.array([1,2,3])
arr2=np.array([4,5,6])
print(arr1+arr2)#简单计算的条件:行列相同
print(arr1-arr2)
print(arr1*arr2)
print(arr1/arr2)
print(arr1**2)
print(arr1+3) #每个元素加上3


ls1=[1,2,3]
ls2=[4,5,6]
print(ls1+ls2) #拼接
# 列表不支持减,乘,除
# print(ls1-ls2) #报错


arr1=np.array([[1,2],[3,4]])
arr2=np.array([[5,6],[7,8]])
print(arr1+arr2)
print(arr1-arr2)
print(arr1*arr2)
print(arr1/arr2)
print(arr1**2)
print(arr1+3) #每个元素加上3


#广播机制
#获取形状
#查看是否可以广播
#行或者列是否相同,如果不同查看是否为一个为1,一个为另一个数字
#1*3和3*1可以;1*3和3*3可以;1*3和1*2不可以
a=np.array([1,2,3]) # 1*3
"""
扩充为
[1,2,3
1,2,3
1,2,3]
"""
b=np.array([[4],[5],[6]])# 3*1
"""
扩充为
[4,4,4
5,5,5
6,6,6]
"""
#使用扩充后的矩阵进行运算
print(a+b)


# 矩阵运算
arr1=np.array([[1,2],[3,4]])
arr2=np.array([[5,6],[7,8]])
"""
arr1
1 2
3 4

arr2
5 6
7 8

arr1 1行,arr2 1列相乘
1 2
5 7
ans=1*5+2*7,那么得出矩阵一行一列位置上的答案
"""
print(arr1 @ arr2)#矩阵乘法

常见函数和指令:

1,数学函数

其中要注意的是求指数和对数的底数都默认是e

2,统计函数

求和,求平均值,中位数,标准差,方差,查找最大值,最小值,求分位数,累积和,累积积

# 求和
# print(np.sum(arr))# 内部参数为列表
# 平均值
# print(np.mean(arr))
# 中位数
# print(np.median(arr))
# print(np.median([1,5,4,2]))
# 标准差和方差
# 方差:((1-2)^2+(2-2)^2+(3-2)^2)/3=(1+0+1)/3=0.666
# 标准差:sqrt(方差)
# print(np.mean([1,2,3]))
# print(np.var([1,2,3])) #方差
# print(np.std([1,2,3])) #标准差
# 最大最小值np.max(),np.min()
# 求出最大最小值的索引值np.argmax(),np.argmin()
# 分位数(中位数是一种特殊的分位数)
# 将数组中的数字进行排序之后放在数轴上,然后取一定比率上的数字,50%即中位数,100%即最后一个数字
# print(np.median([1,2,3]))
# print(np.percentile([1,2,3],50)) # 数组,取50%上的数字,等同中位数
# print(np.percentile([1,2,3],100)) # 取最后一个数字
# 累积和,累积积
# 前缀和,前缀积
# print(np.cumsum([1,2,3]))
# print(np.cumprod([1,3,6]))

3,比较函数

# 比较函数
# 比较是否大于,小于,等于
# 逻辑与或非
# 检查数组中是否有一个True,是否所有的都为True,自定义条件
#%%
# 大于,大于则true
# 数组,比较值
# print(np.greater([3,4,5,6,7],4))

# 小于,小于则true
# print(np.less([1,2,3,4,5],3))

# 等于,等于则True
# print(np.equal([3,4,5,6,7,8],4))

# 数组之间比较(同维度)
# print(np.equal([1,2,3],[2,2,3]))

# 广播机制(不同维度)
# print(np.equal([1,2,3],[[2],[2],[3]]))

# 有与,或,非,异或
# print(np.logical_and([1,2,0],[0,1,0]))
# 广播机制
# print(np.logical_or([0,2,1],[[2],[0],[3]]))

# 检查元素
# 检查元素是否至少有一个元素为True
# print(np.any([0,0,1,0]))
# 检查元素是否全部为True
# print(np.all([0,1,1,1]))
# print(np.all([1,1,1,1]))
# 自定义条件
# where(条件,符合条件的结果,不符合条件的结果)
# arr=np.array([2,3,4,5,6,7])
# print(np.where(arr>3,1,arr))
# print(np.where(arr>3,arr,0))
# 嵌套
# score=np.random.randint(50,100,20)
# print(score)
# print(np.where(
#     score<60,'不及格',np.where(
#         score<80,'及格',np.where(
#             score<90,'不错','优秀'
#         )
#     )
# ))
# select
# print(np.select([score>80,(score>=60)&(score<=80),score<60],['优秀','良好','不及格'],default='未知'))
# 前面是条件数组,后面是结果数组,最后是所有方法都没用的结果

4,排序函数

# 排序函数
np.random.seed(0)
arr=np.random.randint(1,100,20)
print(arr)
# print(arr.sort()) # 会改变原数组顺序
# print(arr)
# print(np.sort(arr))# 仅排序,不改变原数组顺序
# print(np.argsort(arr))# 获取排序之后的大小索引,10的下标即为0
# 去重函数
# print(np.unique(arr))
# 拼接
# arr1=np.array([1,2,3])
# arr2=np.array([2,3,4])
# print(np.concatenate([arr1,arr2]))
# 分割
# print(np.split(arr,2))# 被分割次数必须是数组大小的一个因数,必须要能够整除
# print(np.split(arr,[1,2,3]))# 按分割位置进行划分
print(np.reshape(arr,(4,5))) #将数组重新构筑为新形状,也要能等分