Py学习  »  Python

在Python中从多维数组中删除行

VMEscoli • 5 年前 • 2464 次点击  

我试图删除我的numpy数组中符合特定条件的特定行。

这是一个例子:

a = np.array ([[1,1,0,0,1],
               [0,0,1,1,1],
               [0,1,0,1,1],
               [1,0,1,0,1],
               [0,0,1,0,1],
               [1,0,1,0,0]])

我希望能够删除所有行,其中特定列为零,这个数组可以大很多。 在本例中,如果前两个元素为零,或者后两个元素为零,则将删除行。

它可以是任何组合,不只是第一个或最后一个元素。

这应该是最后的:

a = np.array ([[1,1,0,0,1],
               [0,1,0,1,1],
               [1,0,1,0,1]]) 

例如,如果我尝试:

a[:,0:2] == 0

阅读后:

但他们似乎不适用于我的情况,或者可能我不理解这里的一些东西,因为没有任何工作我的情况。

这给了我所有的行,前两个是零,真,真

array([[False, False],
   [ True,  True],
   [ True, False],
   [False,  True],
   [ True,  True],
   [False,  True]])

最后两列为零,最后一行也应该删除最后我只剩下两排了。

 a[:,3:5] == 0

 array([[ True, False],
       [False, False],
       [False, False],
       [ True, False],
       [ True, False],
       [ True,  True]])

我试着做这样的事情,但是我现在不明白如何告诉它只给我符合条件的行,尽管这只是:

  (a[a[:,0:2]] == 0).all(axis=1)

      array([[ True,  True, False, False, False],
             [False, False,  True,  True, False],
             [False, False, False, False, False],
             [False, False, False, False, False],
             [False, False,  True,  True, False],
             [False, False, False, False, False]])


 (a[((a[:,0])& (a[:,1])) ] == 0).all(axis=1)

这说明一切都是假的

你能给我指点路吗? 谢谢您

再加上一个问题,在这种情况下,它并不总是前2个或后2个如果我的矩阵有35列,可能是第6列到第10列,然后是第20列和第25列。用户将能够决定要删除哪些列。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/48529
 
2464 次点击  
文章 [ 3 ]  |  最新文章 5 年前
Mstaino
Reply   •   1 楼
Mstaino    6 年前

使用以下掩码:

[np.any(a[:,:2], axis=1) & np.any(a[:,:-2], axis=1)]

如果要创建筛选视图:

a[np.any(a[:,:2], axis=1) & np.any(a[:,:-2], axis=1)]

如果要创建新数组:

np.delete(a,np.where(~(np.any(a[:,:2], axis=1) & np.any(a[:,:-2], axis=1))), axis=0)
Daniel Mesejo
Reply   •   2 楼
Daniel Mesejo    6 年前

如果我理解正确,你可以这样做:

import numpy as np

a = np.array([[1, 1, 0, 0, 1],
              [0, 0, 1, 1, 1],
              [0, 1, 0, 1, 1],
              [1, 0, 1, 0, 1],
              [0, 0, 1, 0, 1],
              [1, 0, 1, 0, 0]])

left = np.count_nonzero(a[:, :2], axis=1) != 0
a = a[left]

right = np.count_nonzero(a[:, -2:], axis=1) != 0
a = a[right]

print(a)

输出

[[1 1 0 0 1]
 [0 1 0 1 1]
 [1 0 1 0 1]]

或者,一个较短的版本:

left = np.count_nonzero(a[:, :2], axis=1) != 0
right = np.count_nonzero(a[:, -2:], axis=1) != 0
a = a[(left & right)]
zyxue
Reply   •   3 楼
zyxue    6 年前

试试这个

idx0 = (a[:,0:2] == 0).all(axis=1)

idx1 = (a[:,-2:] == 0).all(axis=1)

a[~(idx0 | idx1)]

前两步选择与筛选条件匹配的行的索引然后做一个 ( | )操作,以及 ( ~ )获取所需最终索引的操作。