NumPy学习(索引和切片,合并,分割,copy与deep copy)
NumPy学习(索引和切片,合并,分割,copy与deep copy)
目录
1 2 3 4 5 | 索引和切片 合并 分割<br><br>copy与deep copy |
索引和切片
通过索引和切片可以访问以及修改数组元素的值
一维数组
程序示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import numpy as np #索引与切片 array = np.arange( 3 , 15 ) print (array) print (array[ 3 ]) #数组下标为3的元素 print ( '\n' ) print (array[ 1 : 3 ]) #取从下标1到下标3,不包括下标3 print (array[ 1 : - 9 ]) print (array[ - 11 : 3 ]) print ( '\n' ) print (array[:]) #全部元素 print (array[ 1 :]) #从下标为1的元素到最后一个元素 print (array[: 7 ]) #第一个元素到下标为7的元素,不包括下标为7的元素 print (array[:: 2 ]) #间隔2 |
运行结果
1 2 3 4 5 6 7 8 9 10 11 12 13 | [ 3 4 5 6 7 8 9 10 11 12 13 14 ] 6 [ 4 5 ] [ 4 5 ] [ 4 5 ] [ 3 4 5 6 7 8 9 10 11 12 13 14 ] [ 4 5 6 7 8 9 10 11 12 13 14 ] [ 3 4 5 6 7 8 9 ] [ 3 5 7 9 11 13 ] |
花式索引
程序示例
1 2 3 4 5 6 7 8 | import numpy as np<br> #指定索引位置 index = [ 1 , 5 , - 7 ] array3 = array[index] print (array3) #使用布尔数组来花式索引 mask = np.array([ 0 , 1 , 0 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 1 ],dtype = bool ) array4 = array[mask] print (array4) |
运行结果
1 2 | [ 4 8 8 ] [ 4 6 7 9 11 14 ] |
多维 数组
程序示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import numpy as np<br>array2 = np.arange( 3 , 15 ).reshape( 3 , 4 ) print (array2) print (array2[ 2 ]) #获取数组的某行 print ( '\n' ) print (array2[ 2 ][ 2 ]) #获取数组的某个元素,指定行和列 print (array2[ 2 , 2 ]) print ( '\n' ) print (array2[ 2 ,:]) #获取数组的第三行 print (array2[:, 2 ]) #获取数组的第三列 print (array2[ 1 : 3 , 1 ]) #获取数组第2和3行的第二列元素 print (array2[ 1 , 1 : 3 ]) #获取数组的第2行的2和3列 print ( '--------------------------------------------------' ) <br> #输出全部行,一行输出成一个列表 for row in array2: print (row) print ( '\n' )<br> #输出全部列,一列输出成一个列表,array2.T为转置 for column in array2.T: print (column) print ( '\n' )<br> #将数组展开为一个列表 print (array2.flatten()) print ( '\n' )<br> #将数组展开为一个列表,其中array2.flat将数组变为迭代器,上面的flatten()方法则直接返回 for item in array2.flat: print (item) |
运行结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | [[ 3 4 5 6 ] [ 7 8 9 10 ] [ 11 12 13 14 ]] [ 11 12 13 14 ] 13 13 [ 11 12 13 14 ] [ 5 9 13 ] [ 8 12 ] [ 8 9 ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - [ 3 4 5 6 ] [ 7 8 9 10 ] [ 11 12 13 14 ] [ 3 7 11 ] [ 4 8 12 ] [ 5 9 13 ] [ 6 10 14 ] [ 3 4 5 6 7 8 9 10 11 12 13 14 ] 3 4 5 6 7 8 9 10 11 12 13 14 |
1 | 花式索引<br>程序示例 |
1 | import numpy as np<br> # 多维数组花式索引,我们需要给定行和列的值<br>arr1=np.array([[4,5,7,9],[2,4,6,8],[7,3,1,7]])<br>print(arr1)<br>print('\n')<br>#返回一条次对角线上的3个值<br>print(arr1[(0,1,2),(1,2,3)])<br>print('\n')<br>#返回的最后2行的第1,2,3列<br>print(arr1[1:,[0,1,2]])<br>#使用mask进行索引<br>print('\n')<br>mask=np.array([1,0,1,1],dtype=bool)<br>arr2=arr1[2,mask]<br>print(arr2) |
运行结果
1 2 3 4 5 6 7 8 9 10 11 12 13 | [[ 4 5 7 9 ] [ 2 4 6 8 ] [ 7 3 1 7 ]] [ 5 6 7 ] [[ 2 4 6 ] [ 7 3 1 ]] [ 7 1 7 ] |
合并
一维数组
程序示例
1 2 3 4 5 6 7 8 9 | import numpy as np array1 = np.array([ 1 , 2 , 3 ]) array2 = np.array([ 4 , 5 , 6 ]) array3 = np.vstack((array1,array2)) #纵向合并 array4 = np.hstack((array1,array2)) #横向合并 print (array3) print (array1.shape) print (array2.shape) print (array3.shape) |
运行结果
1 2 3 4 5 | [[ 1 2 3 ] [ 4 5 6 ]] ( 3 ,) ( 3 ,) ( 2 , 3 ) |
import numpy as np
# #将列表转为numpy的数组
array1=np.array([1,2,3]).reshape(3,1)
array2=np.array([4,5,6]).reshape(3,1)
array3=np.vstack((array1,array2)) #纵向合并
array4=np.hstack((array1,array2)) #横向合并
array5=np.concatenate((array1,array2))
print(array5)
print('\n')
#对多个数组进行合并,axis=0为纵向合并,反之为横向合并
array6=np.concatenate((array1,array2),axis=1)
print(array6)
1 2 3 4 5 6 7 8 9 10 11 | [[ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ]] [[ 1 4 ] [ 2 5 ] [ 3 6 ]] |
分割
程序示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import numpy as np arr1 = np.arange( 12 ).reshape( 3 , 4 ) print (arr1) print ( '横向分割,对列进行分割,分割成2块' ) print (np.split(arr1, 2 ,axis = 1 )) print (np.hsplit(arr1, 2 )) print ( '纵向分割,对行进行分割,分割成3块' ) print (np.split(arr1, 3 ,axis = 0 )) print (np.vsplit(arr1, 3 )) print ( '不等量分割,(1为列,0为行)' ) print (np.array_split(arr1, 3 ,axis = 1 )) |
运行结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | [[ 0 1 2 3 ] [ 4 5 6 7 ] [ 8 9 10 11 ]] 横向分割,对列进行分割,分割成 2 块 [array([[ 0 , 1 ], [ 4 , 5 ], [ 8 , 9 ]]), array([[ 2 , 3 ], [ 6 , 7 ], [ 10 , 11 ]])] [array([[ 0 , 1 ], [ 4 , 5 ], [ 8 , 9 ]]), array([[ 2 , 3 ], [ 6 , 7 ], [ 10 , 11 ]])] 纵向分割,对行进行分割,分割成 3 块 [array([[ 0 , 1 , 2 , 3 ]]), array([[ 4 , 5 , 6 , 7 ]]), array([[ 8 , 9 , 10 , 11 ]])] [array([[ 0 , 1 , 2 , 3 ]]), array([[ 4 , 5 , 6 , 7 ]]), array([[ 8 , 9 , 10 , 11 ]])] 不等量分割,( 1 为列, 0 为行) [array([[ 0 , 1 ], [ 4 , 5 ], [ 8 , 9 ]]), array([[ 2 ], [ 6 ], [ 10 ]]), array([[ 3 ], [ 7 ], [ 11 ]])] |
copy与deep copy
与原数组共享数据的形式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import numpy as np arr = np.arange( 4 ) b = arr c = arr d = b print (arr) print (b) print (c) print (d) print ( '修改arr[0]的值' ) arr[ 0 ] = 10 print (b is arr,b) print (c is arr,c) print (d is arr,d) |
运行结果
1 2 3 4 5 6 7 8 | [ 0 1 2 3 ] [ 0 1 2 3 ] [ 0 1 2 3 ] [ 0 1 2 3 ] 修改arr[ 0 ]的值 True [ 10 1 2 3 ] True [ 10 1 2 3 ] True [ 10 1 2 3 ] |
不与原数据共享数据的形式
1 2 3 4 5 6 7 8 9 10 11 12 13 | import numpy as np arr = np.arange( 4 ) b = arr.copy() print (arr) print (b) print ( '修改arr[0]的值' ) arr[ 0 ] = 10 print (arr) print (b is arr,b) |
运行结果
1 2 3 4 | [ 0 1 2 3 ] [ 0 1 2 3 ] 修改arr[ 0 ]的值 False [ 0 1 2 3 ] |
总结:
如果你想把它们关联起来,就使用第一种方法
如果只是把一个数组的值给另一个数组,使用第二种方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?