概述
1.Numpy的基本属性
import numpy as np
array=np.array([[1,2,3],
[4,5,6],
[7,8,9]])
print(array)
print(array.ndim)#矩阵或数组的维度 包含两个[] []所以为2维,如果包含3个[][][]则为3维
print(array.shape)#矩阵的形状
print(array.size)#矩阵的大小,即矩阵里面有多少个元素
print(array.dtype)#矩阵中每个元素的类型
2.array的创建
2.1
>>> array=np.array([1,2,3],dtype=np.int32)
>>> print(array.dtype)
int32
>>> array=np.array([[1,2,3],[4,5,6]],dtype=np.double)
>>> print(array.dtype)
float64
>>> zero=np.zeros((2,3)) #生成2行3列全部为0的矩阵
>>> print(zero)
[[0. 0. 0.]
[0. 0. 0.]]
>>> one=np.zeros([2,3]) #这种写法与上述写法等价
>>> print(one)
[[0. 0. 0.]
[0. 0. 0.]]
>>> zero=np.zeros((2,3))
>>> zero1=np.zeros_like(zero) #生成与zero大小相同,并且全部为0的矩阵
>>> print(zero1)
[[0. 0. 0.]
[0. 0. 0.]]
>>> one=np.ones((3,4)) #3行4列全部为1的矩阵
>>> print(one)
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
>>> one=np.ones([3,4]) #这种写法与上述等价
>>> print(one)
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
>>> one=np.ones((3,4))
>>> one1=np.ones_like(one) #生成和one大小相同的矩阵,并且全部为1
>>> print(one1)
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
>>> empty=np.empty((3,2)) #生成3行2列都接近于0(但是不等于0)的矩阵
#np.empty((a,b))与np.zeros((a,b))看起来差不多,但是np.zeros((a,b))生成的全部都是全0的矩阵,但是np.empty((a,b))看起来全部都是0,但是其实都是接近0,不等于0的矩阵。
>>> print(empty)
[[0. 0.]
[0. 0.]
[0. 0.]]
比如做个试验来证明一下np.empty((a,b))和np.zeros((a,b))的区别,下面我们用一个常数5来分别除以这2个矩阵。
>>> 5/zero
__main__:1: RuntimeWarning: divide by zero encountered in true_divide
array([[inf, inf, inf],
[inf, inf, inf]])
看第一个试验结果,5/zero的结果为无穷大,但是python编辑器报了一条错误,在除法中分母为0。
>>> 5/empty
array([[inf, inf],
[inf, inf],
[inf, inf]])
看第二个试验结果,5/empty的结果也无无穷大,但是python编译器就没有报错。
来看一个与np.empty()很相似的函数,np.empty_like(A)表示生成一个与A矩阵同样维度大小的矩阵,返回的矩阵里面的元素是随机的。
>>> x=np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> y=np.empty_like(x)
>>> print(y)
[[2621555 3670136 2687030]
[4390973 6029370 7471184]
[6750319 6357106 2097261]]
>>> arr1=np.eye(2,3) #生成对角为1,其余为0的矩阵 注意格式是np.eye(a,b)不是np.eye((a,b))
>>> print(arr1)
[[1. 0. 0.]
[0. 1. 0.]]
2.2
在来看一下另外一种生成一维矩阵的方法
arange是一个左闭,右开的区间。
>>> array=np.arange(10) #生成一个从0到9的一维矩阵
>>> print(array)
[0 1 2 3 4 5 6 7 8 9]
>>> array=np.arange(4,12) #生成一个从4到11的一个一维矩阵
>>> print(array)
[ 4 5 6 7 8 9 10 11]
>>> array=np.arange(1,20,3) #生成一个从1到20 中间间隔为3的一维矩阵
>>> print(array)
[ 1 4 7 10 13 16 19]
>>> array=np.arange(8).reshape(2,4) #将生成的0到7的一维矩阵,转化成一个2*4维的矩阵 重新定义矩阵的形状
>>> print(array)
[[0 1 2 3]
[4 5 6 7]]
#linspace用于生成等差数列,与arange不同的是,它是一个左闭右闭的区间,而且第三个参数不是步长,而是代表总个数
#在画图的时候,用于生成横坐标经常使用到
>>> array=np.linspace(1,10,10)
>>> print(array)
[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
#logspace生成等比数列
#base为设置底数,前三个参数分别代表指数的开头,指数的结尾,和序列的总长度
>>> arr=np.logspace(1,10,10,base=2)
>>> print(arr)
[ 2. 4. 8. 16. 32. 64. 128. 256. 512. 1024.]
3.Numpy的运算1
>>> import numpy as np
>>> arr1=np.array([[1,2,3],[4,5,6]])
>>> arr2=np.array([[1,1,2],[1,2,3]])
>>> print(arr1)
[[1 2 3]
[4 5 6]]
>>> print(arr2)
[[1 1 2]
[1 2 3]]
>>> print(arr1+arr2)
[[2 3 5]
[5 7 9]]
>>> print(arr1-arr2)
[[0 1 1]
[3 3 3]]
>>> print(arr1*arr2) #注意这个矩阵的相乘是对应的位置元素相乘 而不是在线性代数里面那种矩阵的相乘
[[ 1 2 6]
[ 4 10 18]]
>>> print(arr1**arr2) #这个是求幂运算,arr1中每个元素作为底数,arr2中每个元素作为幂指数
[[ 1 2 9]
[ 4 25 216]]
>>> print(arr1/arr2) #矩阵的除法就是对应元素相除
[[1. 2. 1.5]
[4. 2.5 2. ]]
>>> print(arr1%arr2) # 2个矩阵取余就对应矩阵中每个元素取余运算
[[0 0 1]
[0 1 0]]
>>> print(arr1//arr2) #2个矩阵取整操作就 对应矩阵中每个元素进行取整操作
[[1 2 1]
[4 2 2]]
>>> print(arr1+2) # 一个矩阵加上一个常数就相当于矩阵中每一个元素都加上这个常数
[[3 4 5]
[6 7 8]]
>>> print(arr1-2) # 同理 一个矩阵减去一个常数就相当于矩阵中每一个元素都减去这个常数
[[-1 0 1]
[ 2 3 4]]
>>> print(arr1*2) #一个矩阵乘以一个常数 就相当于这个矩阵中每一个元素都乘以这个常数
[[ 2 4 6]
[ 8 10 12]]
>>> print(arr1/2) #一个矩阵除以一个常数 就相当于这个矩阵中每一个元素都除以这个常数
[[0.5 1. 1.5]
[2. 2.5 3. ]]
>>> print(arr1**2)# 对一个矩阵求幂 就相当于对这个矩阵中每一个元素求幂
[[ 1 4 9]
[16 25 36]]
>>> print(arr1//2) #对一个矩阵求整 就相当于对 这个矩阵中每一个元素都求整
[[0 1 1]
[2 2 3]]
>>> arr3=arr1>3 # 看矩阵中每一个元素是否大于3 关系运算之后 得到的结果为逻辑值
>>> print(arr3)
[[False False False]
[ True True True]]
>>> arr4=np.ones((3,5))
>>> print(arr4)
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
>>> print(arr1)
[[1 2 3]
[4 5 6]]
>>> print(np.dot(arr1,arr4)) # np.dot(A,B) 这个就是我们在线性代数里面学到的 矩阵A和矩阵B的相乘
[[ 6. 6. 6. 6. 6.]
[15. 15. 15. 15. 15.]]
>>> print(arr1.dot(arr4)) #这种矩阵的乘法和上面那种是一样的
[[ 6. 6. 6. 6. 6.]
[15. 15. 15. 15. 15.]]
>>> print(arr1)
[[1 2 3]
[4 5 6]]
>>> print(arr1.T) #表示矩阵的转置
[[1 4]
[2 5]
[3 6]]
>>> print(arr1.transpose()) #表示矩阵的转置
[[1 4]
[2 5]
[3 6]]
4.Numpy中的随机数生成以及 矩阵的运算2
>>> import numpy as np
>>> sample1=np.random.random((3,2)) #生成3行2列从0到1的随机数
>>> print(sample1)
[[0.72754235 0.32941459]
[0.54298843 0.25351493]
[0.39643393 0.38612971]]
>>> sample2=np.random.normal(size=(3,2)) #生成3行2列 符合标准正太分布的随机数
>>> print(sample2)
[[ 0.53880077 -0.65971512]
[-1.30112627 -0.56369202]
[ 0.18866346 -0.46796342]]
>>> sample3=np.random.randint(0,10,size=(3,2)) #生成从0到10 3行2列 的随机矩阵
>>> print(sample3)
[[3 3]
[3 2]
[2 2]]
>>> np.sum(sample1) #对前面生成的sample1矩阵进行求和运算
2.636023955239118
>>> np.min(sample1) #求sample1矩阵中的最小值
0.2535149347226694
>>> np.max(sample1) #求sample1矩阵中最大值
0.7275423544172686
>>> np.sum(sample1,axis=1) # 表示对行求和
array([1.05695694, 0.79650337, 0.78256364])
>>> np.sum(sample1,axis=0) # 表示对列求和
array([1.66696472, 0.96905923])
>>> print(sample1)
[[0.72754235 0.32941459]
[0.54298843 0.25351493]
[0.39643393 0.38612971]]
>>> np.argmin(sample1) #求sample1矩阵中最小元素的索引
3
>>> np.argmax(sample1) #求sample1矩阵中最大元素的索引
0
>>> print(np.mean(sample1)) #求sample1矩阵中所有元素的平均值
0.4393373258731863
>>> print(sample1.mean()) #求samplel1矩阵中平均值的另外一种方式
0.4393373258731863
>>> np.median(sample1) #求所有元素的中位数
0.39128182241317594
>>> np.sqrt(sample1) #求矩阵sample1中每个元素的开方
array([[0.85296093, 0.5739465 ],
[0.73687749, 0.50350267],
[0.62963 , 0.62139336]])
>>> sample4=np.random.randint(0,10,size=(1,10)) #生成一个从0到9的一个一维数组
>>> print(sample4)
[[2 7 1 0 2 8 6 2 2 7]]
>>> np.sort(sample4)# 对sample4这个一维数组进行排序
array([[0, 1, 2, 2, 2, 2, 6, 7, 7, 8]])
>>> print(sample1)
[[0.72754235 0.32941459]
[0.54298843 0.25351493]
[0.39643393 0.38612971]]
>>> np.sort(sample1) #如果对一个矩阵进行排序,这默认对一个矩阵的每一行进行排序
array([[0.32941459, 0.72754235],
[0.25351493, 0.54298843],
[0.38612971, 0.39643393]])
>>> np.sort(sample1,axis=1) #对行进行排序
array([[0.32941459, 0.72754235],
[0.25351493, 0.54298843],
[0.38612971, 0.39643393]])
>>> np.sort(sample1,axis=0) #对列进行排序
array([[0.39643393, 0.25351493],
[0.54298843, 0.32941459],
[0.72754235, 0.38612971]])
>>> print(sample4)
[[0 1 2 2 2 2 6 7 7 8]]
>>> np.clip(sample4,2,7) #对sample1中的数据进行处理,sample4中的数据,小于2则变为2,大于7则变为7
#这样就可以控制数据在一定的范围内
array([[2, 2, 2, 2, 2, 2, 6, 7, 7, 7]])
5.Numpy的索引
>>> import numpy as np
>>> arr1=np.arange(2,14)
>>> print(arr1)
[ 2 3 4 5 6 7 8 9 10 11 12 13]
>>> print(arr1[2]) #提取arr1中第2个位置的数据
4
>>> print(arr1[1:4]) #提取arr1中第一个位置到第三个位置的数据
[3 4 5]
>>> print(arr1[1:-1]) #提取arr1中第一个位置到倒数第二个位置的数据 -1在这里就代表最后一个位置
[ 3 4 5 6 7 8 9 10 11 12]
>>> print(arr1[:5]) #提取arr1中第0个位置到第四个位置的数据
[2 3 4 5 6]
>>> print(arr1[-2:]) #提取arr1中最后的2个位置的数据
[12 13]
>>> arr2=arr1.reshape(3,4) #将arr1中的12个数据变为3行4列
>>> print(arr2)
[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
>>> print(arr2[1]) #取出arr2中第一行中的数据
[6 7 8 9]
>>> print(arr2[1,1]) #取出arr2中第一行第一列中的数据
7
>>> print(arr2[1][1]) #这样的写法也可以取出 第一行第一列的元素
7
>>> print(arr2[:2]) #取出arr2中第0行和第一行的数据
[[2 3 4 5]
[6 7 8 9]]
>>> print(arr2[:,2]) #取出arr2中所有的行,第2列中的数据
[ 4 8 12]
arr1=np.arange(2,14)
print(arr1)
arr2=arr1.reshape(3,4)
print(arr2)
for i in arr2: #迭代行
print(i)
for i in arr2.T:#迭代列
print(i)
for i in arr2.flat: #迭代里面的每一个元素 一个一个元素按照列的顺序输出
print(i)
6.array的合并
>>> arr1=np.array([1,2,3])
>>> arr2=np.array([4,5,6])
>>> arr3=np.vstack((arr1,arr2)) #垂直合并
>>> print(arr3)
print(arr3.shape)
[[1 2 3]
[4 5 6]]
(2, 3)
>>> arr1
array([1, 2, 3])
>>> arr2
array([4, 5, 6])
>>> arr3=np.hstack((arr1,arr2)) #水平合并
>>> print(arr3)
[1 2 3 4 5 6]
>>> import numpy as np
>>> arr1=np.array([1,2,3])
>>> arr2=np.array([4,5,6])
>>> arr3=np.vstack((arr1,arr2))
>>> print(arr3)
[[1 2 3]
[4 5 6]]
>>> print(arr3.shape)
(2, 3)
>>> arr4=np.vstack((arr1,arr2,arr3)) #合并多个垂直的数组
>>> print(arr4)
[[1 2 3]
[4 5 6]
[1 2 3]
[4 5 6]]
#同理可以合并多个水平的数组
arr1=np.array([1,2,3])
arr2=np.array([4,5,6])
arr3=np.hstack((arr1,arr2))
print(arr3)
print(arr3.shape)
arr4=np.hstack((arr1,arr2,arr3))
print(arr4)
[1 2 3 4 5 6]
(6,)
[1 2 3 4 5 6 1 2 3 4 5 6]
另外一种合并的方式:用np.concatenate()的形式类合并 #合并的array维度要相同,array形状要匹配,axis=0纵向合并
>>> arr1
array([1, 2, 3])
>>> arr2
array([4, 5, 6])
>>> arr3=np.concatenate((arr1,arr2),axis=0)
>>> print(arr3)
[1 2 3 4 5 6]
>>> arr1=np.array([[1],[2]])
>>> arr2=np.array([[3],[4]])
>>> arr3=np.concatenate((arr1,arr2),axis=1) #横向合并 合并之后的矩阵的维度必须和原来之前的维度大小相同,否则不能合并。
>>> print(arr3)
[[1 3]
[2 4]]
来看一个例子就明白了:
>>> arr1=np.array([[1,2],[3,4]])
>>> arr2=np.array([[5,6],[7,8]])
>>> arr3=np.concatenate((arr1,arr2),axis=0)
>>> print(arr3) #纵向合并
[[1 2]
[3 4]
[5 6]
[7 8]]
>>> arr3=np.concatenate((arr1,arr2),axis=1) #横向合并
>>> print(arr3)
[[1 2 5 6]
[3 4 7 8]]
一维数组不能转置:
>>> arr1=np.array([1,2,3])
>>> print(arr1)
[1 2 3]
>>> print(arr1.T) #不能转置
[1 2 3]
>>> print(arr1.transpose()) #不能转置
[1 2 3]
>>> print(arr1.shape)
(3,) #表明为一维数据
>>> arr1_1=arr1[np.newaxis,:] #增加维度
>>> print(arr1_1)
[[1 2 3]] #原始数据没变
>>> print(arr1_1.shape)
(1, 3) #但是维度变化了,变成了1行3列 变成了2维数据
>>> print(arr1_1.T) #现在就可以转置了
[[1]
[2]
[3]]
>>> arr1_2=arr1[:,np.newaxis] #维度加在后面,就变成了3行1列
>>> print(arr1_2)
[[1]
[2]
[3]]
>>> print(arr1_2.shape) #3行1列
(3, 1)
>>> arr1_3=np.atleast_2d(arr1) #如果数组arr1低于2维,则会转化为2维 np.atleast_3d(arr1)如果是这句话,将会把arr1变为一个3维的数据
>>> print(arr1_3)
[[1 2 3]]
>>> print(arr1_3.T)
[[1]
[2]
[3]]
7.array的分割
>>> import numpy as np
>>> arr1=np.arange(12).reshape((3,4))
>>> print(arr1)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
>>> arr2,arr3=np.split(arr1,2,axis=1) #按照列进行切分,切分的列数必须相等才能够正确输出,水平切分为2份
>>> print(arr2)
[[0 1]
[4 5]
[8 9]]
>>> print(arr3)
[[ 2 3]
[ 6 7]
[10 11]]
>>> arr1=np.arange(12).reshape((4,3))
>>> arr2,arr3=np.split(arr1,2,axis=0) #垂直部分分为2份
>>> print(arr1)
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
>>> print(arr2)
[[0 1 2]
[3 4 5]]
>>> print(arr3)
[[ 6 7 8]
[ 9 10 11]]
>>> arr1=np.arange(12).reshape((3,4))
>>> arr2,arr3,arr4=np.split(arr1,3,axis=0) #垂直部分分为3份
>>> print(arr1)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
>>> print(arr2)
[[0 1 2 3]]
>>> print(arr3)
[[4 5 6 7]]
>>> print(arr4)
[[ 8 9 10 11]]
也可以进行不等分割:
>>> arr1=np.arange(12).reshape(3,4)
>>> print(arr1)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
>>> arr2,arr3,arr4=np.array_split(arr1,3,axis=1) #水平分割3个不等份
>>> print(arr2)
[[0 1]
[4 5]
[8 9]]
>>> print(arr3)
[[ 2]
[ 6]
[10]]
>>> print(arr4)
[[ 3]
[ 7]
[11]]
>>> arr1=np.arange(12).reshape(3,4)
>>> print(arr1)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
>>> arr2,arr3,arr4=np.vsplit(arr1,3) #另外一种方法进行垂直分割,分为3个部分
>>> print(arr2)
[[0 1 2 3]]
>>> print(arr3)
[[4 5 6 7]]
>>> print(arr4)
[[ 8 9 10 11]]
>>> arr1=np.arange(12).reshape(3,4)
>>> print(arr1)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
>>> arr2,arr3=np.hsplit(arr1,2) #水平分割为2部分
>>> print(arr2)
[[0 1]
[4 5]
[8 9]]
>>> print(arr3)
[[ 2 3]
[ 6 7]
[10 11]]
8.array的浅拷贝和深拷贝
>>> arr1=np.array([1,2,3])
>>> arr2=arr1 #arr2和arr1共享同一片内存,相当于C语言中的指针,或者C++中的引用
>>> arr2[0]=5
>>> print(arr1)
[5 2 3]
>>> print(arr2)
[5 2 3]
>>> arr1=np.array([1,2,3])
>>> arr2=arr1.copy() #深拷贝 arr2中的数值改变不会影响arr1中的数值改变
>>> arr2[0]=5
>>> print(arr1)
[1 2 3]
>>> print(arr2)
[5 2 3]
最后
以上就是超级水壶为你收集整理的Numpy入门基本知识点的全部内容,希望文章能够帮你解决Numpy入门基本知识点所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复