我是靠谱客的博主 超级水壶,最近开发中收集的这篇文章主要介绍Numpy入门基本知识点,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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入门基本知识点所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部