删除numpy数组中的行

2024-04-26 11:56:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数组可能是这样的:

ANOVAInputMatrixValuesArray = [[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 
0.53172222], [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]]

注意,其中一行的末尾有一个零值。我想删除任何包含零的行,同时保留所有单元格中包含非零值的行。

但是数组每次填充时将有不同数量的行,而零每次将位于不同的行中。

我使用以下代码行获取每行中非零元素的数量:

NumNonzeroElementsInRows    = (ANOVAInputMatrixValuesArray != 0).sum(1)

对于上面的数组,NumNonzeroElementsInRows包含:[5 4]

五个表示第0行中的所有可能值都不是零,而四个表示第1行中的一个可能值是零。

因此,我试图使用以下代码行来查找和删除包含零值的行。

for q in range(len(NumNonzeroElementsInRows)):
    if NumNonzeroElementsInRows[q] < NumNonzeroElementsInRows.max():
        p.delete(ANOVAInputMatrixValuesArray, q, axis=0)

但由于某种原因,这段代码似乎什么也没做,尽管执行许多print命令表明所有变量似乎都在正确填充,从而导致代码。

必须有一些简单的方法来“删除任何包含零值的行”

有人能告诉我要写什么代码来完成这个任务吗?


Tags: 代码in元素for数量lenifrange
3条回答

从数组中删除行和列的最简单方法是numpy.delete方法。

假设我有以下数组x

x = array([[1,2,3],
        [4,5,6],
        [7,8,9]])

要删除第一行,请执行以下操作:

x = numpy.delete(x, (0), axis=0)

要删除第三列,请执行以下操作:

x = numpy.delete(x,(2), axis=1)

因此,可以找到包含0的行的索引,将它们放入列表或元组中,并将其作为函数的第二个参数传递。

这与您最初的方法类似,并且将使用比unutbu's answer更少的空间,但我怀疑它会更慢。

>>> import numpy as np
>>> p = np.array([[1.5, 0], [1.4,1.5], [1.6, 0], [1.7, 1.8]])
>>> p
array([[ 1.5,  0. ],
       [ 1.4,  1.5],
       [ 1.6,  0. ],
       [ 1.7,  1.8]])
>>> nz = (p == 0).sum(1)
>>> q = p[nz == 0, :]
>>> q
array([[ 1.4,  1.5],
       [ 1.7,  1.8]])

顺便说一下,您的行p.delete()对我不起作用-ndarray没有.delete属性。

这里有一个一行程序(是的,它类似于user333700,但更简单一点):

>>> import numpy as np
>>> arr = np.array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 0.53172222], 
                [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]])
>>> print arr[arr.all(1)]
array([[ 0.96488889,  0.73641667,  0.67521429,  0.592875  ,  0.53172222]])

顺便说一下,这种方法比大型矩阵的掩模阵列方法快得多。对于2048x 5矩阵,此方法大约快1000倍。

顺便说一下,user333700的方法(从他的评论中)在我的测试中稍微快了一点,尽管它让我困惑为什么。

相关问题 更多 >