【问题标题】:How do I delete a row in a numpy array which contains a zero? [duplicate]如何删除包含零的numpy数组中的一行? [复制]
【发布时间】:2013-08-23 08:03:31
【问题描述】:

我正在尝试编写一个函数来删除其中具有零值的所有行。 这不是来自我的代码,而是我正在使用的想法的一个示例:

import numpy as np
a=np.array(([7,1,2,8],[4,0,3,2],[5,8,3,6],[4,3,2,0]))
b=[]

for i in range(len(a)):
    for j in range (len(a[i])):
        if a[i][j]==0:
            b.append(i)

print 'b=', b
for zero_row in b:
    x=np.delete(a,zero_row, 0)

print 'a=',a

这是我的输出:

b= [1, 3]
a= [[7 1 2 8]
 [4 0 3 2]
 [5 8 3 6]
 [4 3 2 0]]

如何去掉 b 中带有索引的行? 抱歉,我对此很陌生,任何帮助将不胜感激。

【问题讨论】:

  • 只有一条评论。您发布的那段示例代码在b 上循环以删除单个行。这根本不需要。 a = np.delete(a, b, axis=0) 就像一个魅力(指定axis 是为了让我们在做什么更明显)

标签: python arrays numpy zero delete-row


【解决方案1】:

我正在尝试编写一个函数来删除其中具有零值的所有行。

你不需要为此编写函数,它可以在一个表达式中完成:

>>> a[np.all(a != 0, axis=1)]
array([[7, 1, 2, 8],
       [5, 8, 3, 6]])

读作:从a中选择所有完全非零的行。

【讨论】:

  • 有没有办法为一维数组做到这一点?你会省略轴规格吗?即 b[np.all(b != 0, )] 其中 b 是一维数组
  • b = b[b!=0] 删除了0 中的b。它被称为布尔索引。
  • 如果要删除所有包含“2”的列怎么办? a[np.all(a !=2, axis=0)] 没有按预期工作。我不得不求助于操纵转置。有什么建议吗?
  • @user1211129 我认为转置然后转回是明智的做法。
【解决方案2】:

貌似np.delete没有改变数组,只是返回一个新数组,所以

代替

x = np.delete(a,zero_row, 0)

试试

a = np.delete(a,zero_row, 0)

【讨论】:

  • 啊,那是愚蠢的,可能是一大早。但是我确实改变了这一点并得到 ValueError:invalid entry 感谢您的快速响应
【解决方案3】:

我想我找到了答案:

正如@tuxcanfly 所说,我将 x 更改为 a。 此外,我现在删除了 for 循环,因为它出于某种原因删除了索引为 2 的行。

相反,我现在只是选择使用 b 作为删除函数删除行,并使用列表中的元素删除具有该索引的行。

新代码:

import numpy as np
a=np.array(([7,1,2,8],[4,0,3,2],[5,8,3,6],[4,3,2,0]))
b=[]

for i in range(len(a)):
    for j in range (len(a[i])):
        if a[i][j]==0:
            b.append(i)
print 'b=',b
for zero_row in b:
    a=np.delete(a,b, 0)

print 'a=',a

和输出:

b= [1, 3]
a= [[7 1 2 8]
 [5 8 3 6]]

【讨论】:

    【解决方案4】:

    我认为这有助于提高可读性(并允许您循环一次,而不是两次):

    #!/usr/bin/env python
    
    import numpy as np
    a = np.array(([7,1,2,8], [4,0,3,2], [5,8,3,6], [4,3,2,0]))
    b = None
    
    for row in a:
        if 0 not in row:
            b = np.vstack((b, row)) if b is not None else row
    
    a = b
    print 'a = ', a
    

    在此版本中,您循环遍历每一行并测试 0 在该行中的成员资格。如果该行不包含零,则尝试使用 np.vstack 将该行附加到名为 b 的数组中。如果 b 尚未赋值,则将其初始化为当前行。

    【讨论】:

      猜你喜欢
      • 2018-01-07
      • 2022-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      • 2022-01-07
      • 2021-06-10
      • 2012-06-26
      相关资源
      最近更新 更多