高效地从nparray中删除零

5

我现在正在使用这种方法:

data = np.array([[0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 6, 0, 0], [0, 0, 0, 0, 1, 2,3, 4, 5, 0, 6, 0, 0]])
index = 0
idx = []
for img in range(len(data)):
    img_raw = np.any(data[img])
    if img_raw == 0.0:
        idx.append(index)
    index+=1
data = np.delete(data, idx, axis=0)

有人知道更好的方法吗?


1
由于整个数组只包含零,因此您可以使用data = np.array([])直接清空其内容。 - Stefan Pochmann
想要的结果是什么?复制粘贴代码并不会改变“data”。 “idx”为空。看起来你想删除完全为零的行。np.delete(data,[0,1,2,3,9,11,12],axis = 1)将删除选定的列。 - hpaulj
2个回答

9
无论什么是数据,Daniel都回答了关于1维数组的问题,这在您的情况下似乎已足够。如果您的数据数组是2维的,则事情会变得有点复杂,因为您不能删除0而不改变数组的维数。在这种情况下,您可以使用掩码数组从考虑中删除非所需值,例如:
import numpy as np
ma_data = np.ma.masked_equal(data,0)
print(ma_data)

任何计算,例如平均数、标准差等,都不考虑掩码值。


请注意,尽管更改了维度,但@Daniel的答案确实成功地删除了2d及更高情况下的零。 - Eric

7

使用逻辑索引:

data = np.zeros(500)
data = data[data!=0]

需要4秒。 - user8580127

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接