numpy的基础学习


前言

Numpy库是Python进行科学计算的基础库,它是一个由多维数组对象组成,包含数学运算、逻辑运算、形状操作、排序、选择、I/O、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等功能。本文将介绍Numpy库的基本操作和简单应用。


一、技巧

ctrl+/在代码前相当于添加#,在按一次取消#,可一次多行添加/减少 #号

二、代码实现

1.创建数组,获取数组维度、形状、大小和定义类型

代码如下:

import numpy as np

# 1定义一个一维数组,注意()里加一个[]
array1=np.array([1,2,3])
# print(array1) # 输出为[1 2 3]

# 2定义一个二维数组,每一个()里有一个[],里面每一行用一个[]
array2 =np.array([
    [1,2,3],
    [4,5,6],
    [7,8,9],
    [10,11,12]
])
# print(array2)
"""
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]"""

# 3.定义一个三维数组
array3 = np.array([
    [[1,2,3],[4,5,6],[7,8,9],[1,1,3]],
    [[1,1,1],[2,2,2],[3,3,3],[4,4,4]],
    [[5,5,5],[6,6,6],[7,7,7],[8,8,8]]
   ])
# print(array3)
"""[[[1 2 3]
  [4 5 6]
  [7 8 9]
  [1 1 3]]

 [[1 1 1]
  [2 2 2]
  [3 3 3]
  [4 4 4]]

 [[5 5 5]
  [6 6 6]
  [7 7 7]
  [8 8 8]]]"""

# 4.获取某个数组的维度,数组名.ndim
dim1=array1.ndim
dim2=array2.ndim
dim3=array3.ndim
# print(dim1,dim2,dim3)  # 输出为1 2 3,就是它们的维数

# 5.获取某个数组的形状.数组名.shape
shape1=array1.shape
shape2=array2.shape
shape3=array3.shape
# print(shape1,shape2,shape3)
"""
输出为(3,) (4, 3) (3, 4, 3)
第一个为3,可以理解为三列
第二个为(43),可以理解成4行,三列
第三个为(3,4,3),可以理解为第一层元素有三个,第二层元素有四个,第三层元素有三个

"""

# 5.改变某个数组的形状,数组名.reshape((形状))
# 注意重新定义的数组size一定和原来的一样
array2_reshape=array2.reshape((6,2))
# print(array2_reshape)
"""[[ 1  2]
 [ 3  4]
 [ 5  6]
 [ 7  8]
 [ 9 10]
 [11 12]]
 
 若输出array2_reshape=array2.reshape((6,3))
print(array2_reshape)则会报错"""

# 6.生成全是0的数组,并且给定形状np.zeros((形状))
zero_array = np.zeros((3,4,5))
# print(zero_array)
"""[[[0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]]

 [[0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]]

 [[0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]]]"""

# 7.生成全是1的数组
one_array = np.ones((3,4,5))
# print(one_array)
"""[[[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]

 [[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]

 [[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]]"""

# 8.生成有序数组(相当于列表中的range())
arange_array=np.arange(0,6).reshape((2,3))
# print(arange_array)
"""[[0 1 2]
 [3 4 5]]"""

# 9.获取某个数组共有多少个元素,数组名.size
size1=array1.size
size2=array2.size
size3=array3.size
# print(size1,size2,size3)   # 输出3 12 36

# 10.定义数组中元素的类型,array([],dtype=np.某某)
# 获取某数组中元素的类型,数组名.dtype
# (1)整数
array4 = np.array([1,2,3],dtype=np.int) # 如果int后什么都不加,默认是32位
dtype4 = array4.dtype
# print(dtype4)  #int32

array5 = np.array([1,2,3],dtype=np.int64) # 如果int后什么都不加,默认是32位
dtype5 = array5.dtype
# print(dtype5)  #int64

# (2)浮点数
array6=np.array([1,2,3],dtype=np.float) # 如果float后什么都不加,默认是64位
dtype6=array6.dtype
print(dtype6)  # float64

# 之前生成全0数组,我们将它改为整型
zero1_array = np.zeros((3,4,5),dtype=np.int)
dtype7=zero1_array
print(zero1_array)
"""[[[0 0 0 0 0]
  [0 0 0 0 0]
  [0 0 0 0 0]
  [0 0 0 0 0]]

 [[0 0 0 0 0]
  [0 0 0 0 0]
  [0 0 0 0 0]
  [0 0 0 0 0]]

 [[0 0 0 0 0]
  [0 0 0 0 0]
  [0 0 0 0 0]
  [0 0 0 0 0]]]"""

2.合并与分割

代码如下(示例):

import numpy as np
# 1.上下合并  np.vstack((A,B))
# 注意两个数组的列数必须相同
A = np.array([
    [1,2,3],
    [4,5,6]
])

B = np.array([
    [1,1,1],
    [2,2,2]
])
C = np.vstack((A,B))
# print(C)
"""
[[1 2 3]
 [4 5 6]
 [1 1 1]
 [2 2 2]]
 """

# 2.水平合并 np.hstack((A,B))
# 注意两个数组行数必须相等
D = np.hstack((A,B))
# print(D)
"""[[1 2 3 1 1 1]
 [4 5 6 2 2 2]]"""

# 3.axis=0代表列,axis=1代表行,连接
A1 = np.array([
    [1,2,3],
    [4,5,6]
])

B1 = np.array([
    [1,1,1],
    [2,2,2]
])
C1 = np.concatenate((A1,B1),axis=0)
C2 = np.concatenate((A1,B1),axis=1)
# print(C1)
# print(C2)
"""
[[1 2 3]
 [4 5 6]
 [1 1 1]
 [2 2 2]]
[[1 2 3 1 1 1]
 [4 5 6 2 2 2]]
 """

# 4.竖直分割/水平分割  vsplit/hsplitc
A2 = np.arange(0,20).reshape((4,5)) #45列
C2 = np.vsplit(A2,2) # 这里的分割是平均分割(分成数组的名字,分成几块)
D2 = np.hsplit(A2,5)
# print(A2)
# print(C2)
# print(D2)
"""[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]
 
[array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]]), array([[10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])]
       
       [array([[ 0],
       [ 5],
       [10],
       [15]]), array([[ 1],
       [ 6],
       [11],
       [16]]), array([[ 2],
       [ 7],
       [12],
       [17]]), array([[ 3],
       [ 8],
       [13],
       [18]]), array([[ 4],
       [ 9],
       [14],
       [19]])]
"""

# 5.使用axis进行平均分割
E = np.split(A2,2,axis=0)
F = np.split(A2,5,axis=1)
# print(E)
# print(F)
"""结果[array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]]), array([[10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])]
       
       [array([[ 0],
       [ 5],
       [10],
       [15]]), array([[ 1],
       [ 6],
       [11],
       [16]]), array([[ 2],
       [ 7],
       [12],
       [17]]), array([[ 3],
       [ 8],
       [13],
       [18]]), array([[ 4],
       [ 9],
       [14],
       [19]])]"""


# 6.不平均分割
G = np.array_split(A2,3,axis=0)
print(G)
"""结果[array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]]), array([[10, 11, 12, 13, 14]]), array([[15, 16, 17, 18, 19]])]
"""

3.索引、数组中数值的替换

import numpy as np

# 1.索引
# (1)提取数组中某个指定下标的值
array2 =np.array([
    [1,2,3],
    [4,5,6],
    [7,8,9],
    [10,11,12]
])
a = array2[1,1] # 二维数组,[]中第一个是行,第二个是列,这里面写的是第二行,第二个
#print(a) # 输出5

# (2)提取数组中某一列/行的值
b = array2[:,0] # :指的是从第一个到最后一个
# print(b) # 输出 [ 1  4  7 10] 拿第一列

c = array2[1,:]
# print(c) # 输出 [4 5 6] 拿第二行

# 2.数组中数值的替换
# (1)指定下标的数值替换为某个数
# 注意原数组会被该表
array2[1,1] = 2
# print(array2) # 将第二行,第二列替换为2
"""[[ 1  2  3]
 [ 4  2  6]
 [ 7  8  9]
 [10 11 12]]"""

# (2)将某一列/行的值全部替换
array2[:,1] = 6
# print(array2) # 第二列全为6
"""[[ 1  6  3]
 [ 4  6  6]
 [ 7  6  9]
 [10  6 12]]"""

array2[1,:] = 8
#print(array2)
"""[[ 1  6  3]
 [ 8  8  8]
 [ 7  6  9]
 [10  6 12]]"""

# (3)把数组中所有等于6的值替换成-1
array2[array2==6] = -1
# print(array2)
"""[[ 1 -1  3]
 [ 8  8  8]
 [ 7 -1  9]
 [10 -1 12]]"""

# (4)把数组中小于0的值替换成100
array2[array2<0] = 100
# print(array2)
"""[[  1 100   3]
 [  8   8   8]
 [  7 100   9]
 [ 10 100  12]]"""

# (5)把数组中所有小于2的数值替换成2,原数组不改变
array3 =np.array([
    [1,2,3],
    [4,5,6],
    [7,8,9],
    [10,11,12]
])
# clip正常情况下写两个值,一个是上限,一个是下限
# 如果想把想把小于2的值替换成2,就写一个2就行了
# array3_change = array3.clip(2)
# print(array2) # 与之前改变的对比看
# print(array3)
# print(array3_change)
"""[[  1 100   3]
 [  8   8   8]
 [  7 100   9]
 [ 10 100  12]]
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
[[ 2  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]"""

# (6)把数组中大于10的值替换成10,原数组不改变
# float("-inf")是无穷小的意思,float("+inf")是无穷大的意思
# 没有下限,大于10的替换成10
# array3_change = array3.clip(float("-inf"),10)
# print(array3)
# print(array3_change)
"""[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
[[ 1.  2.  3.]
 [ 4.  5.  6.]
 [ 7.  8.  9.]
 [10. 10. 10.]]"""

# (7)把数组中所有小于2的数改变成2,所有大于10的数改变成10,原数组不变
array3_change = array3.clip(2,10)
print(array3)
print(array3_change)
"""[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
[[ 2  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 10 10]]"""

4.numpy的其他功能:copy、三角函数、布尔值、求和、平均值等

import numpy as np

# 1.numpy中的其他功能
#(1)copy
# copy的值不会变,在处理数据时可以先copy一份
A = np.arange(6).reshape((2,3))
B=A
C=np.copy(A)
A[A==2]=-1
# print(A)
# print(B)
# print(C)
"""[[ 0  1 -1]
 [ 3  4  5]]
[[ 0  1 -1]
 [ 3  4  5]]
[[0 1 2]
 [3 4 5]]"""

# 2.n次方
# 这个的n次方是指数组中的每个数的三次方
f = C**3
# print(C)
# print(f)
"""[[0 1 2]
 [3 4 5]]
[[  0   1   8]
 [ 27  64 125]]"""

# 3.三角函数
# 括号里要用弧度表示,π的书写np.pi
E = np.sin(30/180*np.pi)
# print(E)  # 0.49999999999999994

F = np.array([[30,60,90],[120,150,180]])
G = np.sin(F/180*np.pi)
# print(G)
"""[[5.00000000e-01 8.66025404e-01 1.00000000e+00]
 [8.66025404e-01 5.00000000e-01 1.22464680e-16]]"""

# 4.对数组中所有元素进行判断是否符合某个条件,返回的是ture或者false
g = C>2
# print(g)
"""[[False False False]
 [ True  True  True]]"""

array2 =np.array([
    [1,2,3],
    [4,5,6],
    [7,8,9],
    [10,11,12]
])
array5=np.array([[1,5,3],
                 [4,5,6],
                 [5,8,9],
                 [10,11,12]])
h = array2==array5 #对于这两个数组中的元素,对应元素进行比较
# print(h)
"""[[ True False  True]
 [ True  True  True]
 [False  True  True]
 [ True  True  True]]"""

# 5.求数组中的最大值/最小值/平均值//中位数
#np.max(数组名)/np.min(数组名)/np.mean(数组名)/np.sum(数组名)/np.median(数组名)
mean=np.mean(C,axis=0) # 求每列平均值
# print(mean) #[1.5 2.5 3.5]

mean1=np.mean(C) # 所有数组中元素的平均值
print(mean1) #2.5


5.数组的基本运算

import numpy as np

# 1. 数组的基本运算
# 数和数组的加减乘除,数组里每一个数都与这个数组加减乘除
A = np.arange(6).reshape((2,3))
a=1
B=a+A
# print(A)
# print(B)
"""[[0 1 2]
 [3 4 5]]
[[1 2 3]
 [4 5 6]]"""

b=2
C=b*A
# print(A)
# print(C)
"""[[0 1 2]
 [3 4 5]]
[[ 0  2  4]
 [ 6  8 10]]"""

# 一维数组和一维数组的加减乘除,对应位置加减乘除
A1=np.arange(1,4)
B1=np.arange(2,5)
C=A1*B1
# print(A1)
# print(B1)
# print(C)
"""[1 2 3]
[2 3 4]
[ 2  6 12]"""

# 一维数组和二维数组加减乘除,每一行的对应位置加减乘除
# 列数要一样
A2 = np.arange(2,5)
B2 = np.arange(0,6).reshape((2,3))
C2=A2*B2
# print(A2) #[2 3 4]
# print(B2) #[[0 1 2][3 4 5]]
# print(C2)#[[ 0  3  8][ 6 12 20]]

# 二维数组与二维数组加减乘除,每一行对应位置加减乘除
# 两二维数组必须形状完全一致
A3 = np.arange(6,12).reshape((2,3))
B3 = np.arange(0,6).reshape((2,3))
C3 = A3*B3
print(A3)
print(B3)
print(C3)
"""A3=[[ 6  7  8]
 [ 9 10 11]]
B3=[[0 1 2]
 [3 4 5]]
C3=[[ 0  7 16]
 [27 40 55]]"""



6.矩阵的相关运算

import numpy as np

# 1.矩阵的加法
# 注意,必须是两个同型矩阵才能相加
# 与数组的相加区别:行向量与列向量不能与矩阵相加,一个数不能与矩阵相加
A=np.arange(1,7).reshape((2,3))
B = np.arange(2,8).reshape((2,3))
C=A+B
# print(A)
# print(B)
# print(C)
"""[[1 2 3]
[4 5 6]]
[[2 3 4]
[5 6 7]]
[[ 3  5  7]
[ 9 11 13]]
"""
# 2.矩阵的数乘
# 和numpy中的一个数与一个数组相乘是一样的
A1 =np.arange(6).reshape((2,3))
a =2
B1=a*A1
# print(A1)
# print(B1)
"""[[0 1 2]
 [3 4 5]]
[[ 0  2  4]
 [ 6  8 10]]"""

# 3.矩阵与矩阵相乘(线性代数)
#注意区别二维数组与二维数组相乘的条件
A2=np.arange(1,13).reshape((3,4))
B2 = np.arange(2,10).reshape((4,2))
#下面两个C2方法都可以
C2=np.matmul(A2,B2)
# C2=np.dot(A2,B2)
# print(A2)
# print(B2)
# print(C2)
"""[[ 1  2  3  4]
[ 5  6  7  8]
[ 9 10 11 12]]
[[2 3]
[4 5]
[6 7]
[8 9]]
[[ 60  70]
[140 166]
[220 262]]"""

# 4.求转置矩阵
A3=np.arange(1,13).reshape((3,4))
# 有两种方法表示转置
B3=A3.T
#B3=np.transpose(A3)
# print(A3)
# print(B3)
"""[[ 1  2  3  4]
  [ 5  6  7  8]
  [ 9 10 11 12]]

 [[ 1  5  9]
  [ 2  6 10]
  [ 3  7 11]
  [ 4  8 12]]"""

# 5求逆矩阵,只有方阵才有逆矩阵
A4=np.array([[2,3],[4,5]])
B4=np.linalg.inv(A4)
# print(A4)
# print(B4)
"""
[[2 3]
 [4 5]]
[[-2.5  1.5]
 [ 2.  -1. ]]
"""

# 6.求方阵行列式的值
A5=np.arange(1,10).reshape((3,3))
B5=np.linalg.det(A5)
# print(B5) #6.66133814775094e-16

# 7.求线性方程组的解
A6=np.array([
    [1,-2,3,-4],
    [1,3,0,-3],
    [0,1,-1,1],
    [1,1,1,1]
])
a6=np.array([4,1,-3,6])
x=np.linalg.solve(A6,a6)
# print(x) #[-8.    4.25  8.5   1.25]


7.补充

import numpy as np

# 1.生成全是2的数组
# 之前学过生成全是0,1的数组
two_array = np.ones((2,5,2))*2
# print(two_array)
"""[[[2. 2.]
  [2. 2.]
  [2. 2.]
  [2. 2.]
  [2. 2.]]

 [[2. 2.]
  [2. 2.]
  [2. 2.]
  [2. 2.]
  [2. 2.]]]"""

# 2.numpy数组中如何对某一行或某一列进行条件赋值
# 对某一列元素进行替换,第二列大于11的值进行替换
A=np.arange(1,21).reshape((5,4))
# print(A)
A[:,1][A[:,1]>11]=100
# print(A)
"""[[  1   2   3   4]
 [  5   6   7   8]
 [  9  10  11  12]
 [ 13 100  15  16]
 [ 17 100  19  20]]"""

# 3.数组合并中维度的要求,numpy中append的用法
# 使用vstack或者hstack的时候,两个数组不一定要有同样的维度
# 但必须列数/行数相同
A1=np.arange(1,9).reshape((2,4))
B1=np.arange(1,5).reshape((1,4))
# print(A1)
# print(B1)
# C=np.vstack((A1,B1))
# print(C)
"""[[1 2 3 4]
 [5 6 7 8]]
[[1 2 3 4]]
[[1 2 3 4]
 [5 6 7 8]
 [1 2 3 4]]"""

# 使用concatenate必须两个维度相同;列数(axis=0/行数(axis=1)相同
# C=np.concatenate((A1,B1),axis=0)
# print(C)
"""
[[1 2 3 4]
 [5 6 7 8]
 [1 2 3 4]]"""

# numpy中的append的用法(注意和列表中的append对比记忆)
# 两个数组维度必须相同,列数/行数相同
# 写法上和concatenate的区别是两个数组不需要再用括号括起来
c=np.append(A1,B1,axis=0)
print(c)
"""[[1 2 3 4]
 [5 6 7 8]
 [1 2 3 4]]"""



总结

以上就是我对numpy的基础学习。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值