繁体   English   中英

如何删除 numpy python 中的行和列?

[英]how to delete rows and columns in numpy python?

我在创建 function 时遇到问题,它以矩阵 M 作为输入并删除包含数字 0 的行和列,并给出包含剩余数字的 output。 非常感谢任何帮助,因为我的编程考试即将到来。

通过“删除行和列”这就是我的意思: 在此处输入图像描述

import numpy as np

x = np.array([[1,2,3,4,5],
              [6,0,8,9,10],
              [11,12,13,14,15],
              [16,0,0,19,20]])

idxs_array = list(np.where(x==0))
idxs_array = [list(dict.fromkeys(x)) for x in idxs_array]

for axis, idxs in enumerate(idxs_array):
    sub_factor = 0
    for idx in idxs:
        x = np.delete(x,idx-sub_factor,axis)
        sub_factor += 1

print(x)
       
# x = [[ 1,  4,  5],
#      [11, 14, 15]]

1. 定位零元素

首先,我们需要确定矩阵中零元素的位置,这可以通过np.where()轻松完成。

np.where将返回匹配特定条件( doc )的元素的行/列索引。

row_idx, col_idx = np.where(arr == 0)

2.删除对应的行/列

要删除相应的行和列,有一种简单的方法可以做到这一点,即索引 ( doc )。

也就是说,您可以使用True指定要保留的行(或列),否则应为False

print(np.arange(4)[[True, False, True, False]])
# array([0, 2])

3.把两件事放在一起

这是一个最小的例子。

arr = np.array([[ 1,  2,  3,  4,  5],
                [ 6,  0,  8,  9, 10],
                [11, 12, 13, 14, 15],
                [16,  0,  0, 19, 20]])
 
row_idx, col_idx = np.where(arr == 0)

rm_row_idx = set(row_idx.tolist())
rm_col_idx = set(col_idx.tolist())

row_mask = [i not in rm_row_idx for i in range(arr.shape[0])]
col_mask = [i not in rm_col_idx for i in range(arr.shape[1])]

arr = arr[row_mask, :]
arr = arr[:, col_mask]

print(arr)

# Shall be:
# array([[ 1,  4,  5],
#        [11, 14, 15]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM