本文主要是介绍python不改变二维数组相对位置,得到对应行(列/元素)满足条件的新数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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仍需努力啊!
这篇关于python不改变二维数组相对位置,得到对应行(列/元素)满足条件的新数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!