python不改变二维数组相对位置,得到对应行(列/元素)满足条件的新数组 骑猪看日落 2022-03-30 15:42 231阅读 0赞 ## python不改变二维数组相对位置,得到对应行(列)满足条件的新数组 ## 有时候,程序中会用到不改变二维数组相对位置,得到元素满足对应条件的行。 比如,给定一个坐标数组,要求剔除掉x,y坐标不满足>0条件的坐标。 ### 引子:一维数组 ### 对于一维数组来说,实现这个功能很简单。有多种方法可以选择。 #### 方法一:直接法 #### A = np.array([1,2,3,4,5,6,0,-2,7,8,9]) result = A[A>0] # 输出:array([1,2,3,4,5,6,7,8,9])。可以看到已经删掉了小于0的元素 print(result) #### 方法二:where()+数组切片 #### 通过np.where()函数获取满足条件的元素所在的位置,然后利用数组切片找出。 A = np.array([1,2,3,4,5,6,0,-2,7,8,9]) ind = np.where(A>0) result = A[ind] # 输出:array([1,2,3,4,5,6,7,8,9])。可以看到已经删掉了小于0的元素 print(result) ### 二维数组 ### 对于二维数组来说,使用上边两个方法都会导致数组展开成一维的,如下。 #首先生成一个2行6列的随机整数组 A= np.random.randint(-4,4,(2,6)) print("A:",A)#每次运行生成的数组不一样 #方法一: ind = np.where(A>0) result1 = A[ind] print("result1:",result1) #方法二: result2 = A[A>0] print("result2:",result2) #方法三:同方法二,只是使用了array.nonzero()函数寻找非0索引 ind = A.nonzero() result3 = A[ind] print("result3:",result3) 运行结果: A: [[ 1 -3 0 1 3 2] [ 0 1 1 -3 0 2]] result1: array([1, 1, 3, 2, 1, 1, 2]) result2: array([1, 1, 3, 2, 1, 1, 2]) result3: array([1, 1, 3, 2, 1, 1, 2]) 可以看到,以上三种方法都改变了数组本来的结构。展成了一维数组。 要想维持数组本来的结构,就需要用到 `all()` 和 `any()` 函数。 他们的实现原理是:对数组中的每个元素判断的逻辑值再按行(列)进行一个逻辑合并。 可选参数:axis * axis =0 列。 * axis = 1行。 两两组合之下,可以灵活地实现四种功能。比如,对于一个二维数组A来说: A= np.array([[1,-3,0,1,3,2],[0,1,1,-3,0,2]]) print("A:",A) ind1 = (A>0).all(0)#找出所有元素都大于零的列索引 res1 = A[:,ind1] #得到A元素中每个元素均大于0的列 print("res1:",res1) ind2 = (A>0).any(0)#找出任一元素大于零的列索引 res2 = A[:,ind2]#得到A元素中任一元素大于0的列 print("res2:",res2) ind3 = (A>0).all(1)#找出所有元素都大于零的行索引 res3 = A[ind3,:]#得到A元素中所有元素都大于0的行 print("res3:",res3) ind4 = (A>0).any(1)#找出任一元素大于零的行索引 res4 = A[ind4,:]#得到A元素中任一元素大于0的行 print("res4:",res4) 返回结果如下: A: [[ 1 -3 0 1 3 2] [ 0 1 1 -3 0 2]] res1: [[2] [2]] res2: [[ 1 -3 0 1 3 2] [ 0 1 1 -3 0 2]] res3: [] res4: [[ 1 -3 0 1 3 2] [ 0 1 1 -3 0 2]] -------------------- 最后,补充一下MATLAB实现类似功能的语句:`B = A(:,all(A > 0,1))` ,两者很相似,但是从语法简洁性来看,还是MATLAB更简洁一点。革命尚未成功,python仍需努力啊!
还没有评论,来说两句吧...