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仍需努力啊!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 可以使用以下代码实现: ```python # 从键盘输入一个44二维数组元素 arr = [] for i in range(4): row = input("请输入第{}元素,以空格分隔:".format(i+1)).split() row = [int(x) for x in row] arr.append(row) # 求第一元素之和 sum = for i in range(4): sum += arr[i][] print("第一元素之和为:", sum) ``` 运结果如下: ``` 请输入第1元素,以空格分隔:1 2 3 4 请输入第2元素,以空格分隔:5 6 7 8 请输入第3元素,以空格分隔:9 10 11 12 请输入第4元素,以空格分隔:13 14 15 16 第一元素之和为: 28 ``` ### 回答2: 在计算第一元素之和之前,我们需要先明确什么是二维数组二维数组是由多个一维数组组成的数据结构,每个一维数组代表一,每个元素都有对应。在C++中,我们可以使用二重循环来逐个访问二维数组的每个元素,计算第一元素的和。 以下是实现过程: 首先,我们需要定义一个44二维数组,可以通过以下语句来实现: int arr[4][4]; 然后,我们需要使用循环语句对这个二维数组赋值操作,可以使用以下语句实现: for(int i = 0; i < 4; i++){ for(int j = 0; j < 4; j++){ cin >> arr[i][j]; } } 这样,我们就可以通过键盘输入一个44二维数组元素。接下来,我们需要遍历数组的第一,并计算其所有元素之和。可以使用以下语句实现: int sum = 0; for(int i = 0; i < 4; i++){ sum += arr[i][0]; } 最后,我们将计算得到的和输出,即可得到第一元素之和。完整的代码如下: #include <iostream> using namespace std; int main(){ int arr[4][4]; for(int i = 0; i < 4; i++){ for(int j = 0; j < 4; j++){ cin >> arr[i][j]; } } int sum = 0; for(int i = 0; i < 4; i++){ sum += arr[i][0]; } cout << "第一元素之和为:" << sum << endl; return 0; } ### 回答3: 首先,要使用一个双重循环来输入二维数组元素。首先使用一个for循环来遍历二维数组的每一,然后使用另一个for循环来遍历每一中的每一个元素,然后使用cin语句来输入每个元素的值。 接着,可以定义一个变量sum来存储第一元素之和,并使用一个for循环来遍历每一的第一个元素,并将其加到sum中。最后输出sum即可。 以下是代码示例: ``` #include <iostream> using namespace std; int main() { int arr[4][4]; // 输入二维数组元素 for(int i=0; i<4; i++) { for(int j=0; j<4; j++) { cout << "请输入数组元素arr[" << i << "][" << j << "]的值:"; cin >> arr[i][j]; } } // 计算第一元素之和 int sum = 0; for(int i=0; i<4; i++) { sum += arr[i][0]; } // 输出第一元素之和 cout << "第一元素之和为:" << sum << endl; return 0; } ``` 注意,以上代码只是一种可能的实现方式,还可以使用其他方式来实现相同的功能。此外,代码中没有做输入数据的错误处理,实际应用中需要根据具体情况进相应的处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东写西读李老湿

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值