NumPy学习(索引和切片,合并,分割,copy与deep copy)
Posted -wenli
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NumPy学习(索引和切片,合并,分割,copy与deep copy)相关的知识,希望对你有一定的参考价值。
NumPy学习(索引和切片,合并,分割,copy与deep copy)
目录
索引和切片 合并 分割
copy与deep copy
索引和切片
通过索引和切片可以访问以及修改数组元素的值
一维数组
程序示例
import numpy as np #索引与切片 array=np.arange(3,15) print(array) print(array[3])#数组下标为3的元素 print(‘ ‘) print(array[1:3])#取从下标1到下标3,不包括下标3 print(array[1:-9]) print(array[-11:3]) print(‘ ‘) print(array[:]) #全部元素 print(array[1:])#从下标为1的元素到最后一个元素 print(array[:7])#第一个元素到下标为7的元素,不包括下标为7的元素 print(array[::2])#间隔2
运行结果
[ 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]
花式索引
程序示例
import numpy as np
#指定索引位置 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)
运行结果
[4 8 8] [ 4 6 7 9 11 14]
多维 数组
程序示例
import numpy as np
array2=np.arange(3,15).reshape(3,4) print(array2) print(array2[2])#获取数组的某行 print(‘ ‘) print(array2[2][2])#获取数组的某个元素,指定行和列 print(array2[2,2]) print(‘ ‘) print(array2[2,:])#获取数组的第三行 print(array2[:,2])#获取数组的第三列 print(array2[1:3,1])#获取数组第2和3行的第二列元素 print(array2[1,1:3])#获取数组的第2行的2和3列 print(‘--------------------------------------------------‘)
#输出全部行,一行输出成一个列表 for row in array2: print(row) print(‘ ‘)
#输出全部列,一列输出成一个列表,array2.T为转置 for column in array2.T: print(column) print(‘ ‘)
#将数组展开为一个列表 print(array2.flatten()) print(‘ ‘)
#将数组展开为一个列表,其中array2.flat将数组变为迭代器,上面的flatten()方法则直接返回 for item in array2.flat: print(item)
运行结果
[[ 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
花式索引
程序示例
import numpy as np
# 多维数组花式索引,我们需要给定行和列的值
arr1=np.array([[4,5,7,9],[2,4,6,8],[7,3,1,7]])
print(arr1)
print(‘ ‘)
#返回一条次对角线上的3个值
print(arr1[(0,1,2),(1,2,3)])
print(‘ ‘)
#返回的最后2行的第1,2,3列
print(arr1[1:,[0,1,2]])
#使用mask进行索引
print(‘ ‘)
mask=np.array([1,0,1,1],dtype=bool)
arr2=arr1[2,mask]
print(arr2)
运行结果
[[4 5 7 9] [2 4 6 8] [7 3 1 7]] [5 6 7] [[2 4 6] [7 3 1]] [7 1 7]
合并
一维数组
程序示例
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 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(‘ ‘)
#对多个数组进行合并,axis=0为纵向合并,反之为横向合并
array6=np.concatenate((array1,array2),axis=1)
print(array6)
[[1] [2] [3] [4] [5] [6]] [[1 4] [2 5] [3 6]]
分割
程序示例
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))
运行结果
[[ 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
与原数组共享数据的形式
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)
运行结果
[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]
不与原数据共享数据的形式
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)
运行结果
[0 1 2 3] [0 1 2 3] 修改arr[0]的值 False [0 1 2 3]
总结:
如果你想把它们关联起来,就使用第一种方法
如果只是把一个数组的值给另一个数组,使用第二种方法
以上是关于NumPy学习(索引和切片,合并,分割,copy与deep copy)的主要内容,如果未能解决你的问题,请参考以下文章