我有一个可能如下所示的数组:
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)
但由于某些原因,这段代码似乎没有做任何事情,即使执行大量打印命令表明所有变量似乎都正确填充,导致代码。
必须有一些简单的方法来简单地“删除任何包含零值的行。”
任何人都可以告诉我要写什么代码来实现这个目标吗?
答案 0 :(得分:134)
从数组中删除行和列的最简单方法是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的行的索引,将它们放在列表或元组中,并将其作为函数的第二个参数传递。
答案 1 :(得分:13)
这是一个单行(是的,它类似于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]])
顺便说一句,这种方法比大型矩阵的掩码数组方法快得多。对于2048 x 5矩阵,此方法的速度提高了约1000倍。
顺便说一句,user333700的方法(来自他的评论)在我的测试中稍快一些,尽管让我难以理解为什么。
答案 2 :(得分:5)
这与您的原始方法类似,并且使用的空间将小于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
属性。
答案 3 :(得分:2)
numpy提供了一个简单的函数来完成同样的事情: 假设您有一个掩码数组'a',调用numpy.ma.compress_rows(a)将删除包含掩码值的行。 我想这种方式要快得多......
答案 4 :(得分:0)
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[np.where(arr != 0.)])
答案 5 :(得分:-1)
我可能来不及回答这个问题,但是为了社区的利益想分享我的意见。对于这个例子,让我打电话给你的矩阵&#39; ANOVA&#39;,我假设你只是试图从第5列中的0#中删除这个矩阵中的行。
indx = []
for i in range(len(ANOVA)):
if int(ANOVA[i,4]) == int(0):
indx.append(i)
ANOVA = [x for x in ANOVA if not x in indx]