从 numpy 数组中删除一些元素

新手上路,请多包涵

一个有趣的问题:

我想从一个 numpy 数组中删除一些元素,但就像下面简化的示例代码一样,如果不删除最后一个元素它就可以工作,但是如果我们想删除最后一个元素它就会失败。下面的代码工作正常:

 import numpy as np

values = np.array([0,1,2,3,4,5])
print values
for i in [3,4,1]:
    values = np.delete(values,i)
print values

输出是:

 [0 1 2 3 4 5]
[0 2 4]

如果我们只将 4 更改为 5,那么它将失败:

 import numpy as np

values = np.array([0,1,2,3,4,5])
print values
for i in [3,5,1]:
    values = np.delete(values,i)
print values

错误信息:

 IndexError: index 5 is out of bounds for axis 0 with size 5

为什么只在删除最后一个元素时才会发生此错误?执行此类任务的正确方法是什么?

原文由 lucky1928 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 528
2 个回答

请记住, np.delete(arr, ind) 删除索引处的元素 ind 而不是具有该值的元素。

这意味着当你删除东西时,数组会变短。所以你开始

values = [0,1,2,3,4,5]
np.delete(values, 3)
[0,1,2,4,5]  #deleted element 3 so now only 5 elements in the list
#tries to delete the element at the fifth index but the array indices only go from 0-4
np.delete(values, 5)

解决问题的方法之一是按降序对要删除的索引进行排序(如果您确实要删除数组)。

 inds_to_delete = sorted([3,1,5], reverse=True) # [5,3,1]
# then delete in order of largest to smallest ind

或者:

 inds_to_keep = np.array([0,2,4])
values = values[inds_to_keep]

原文由 Garrett R 发布,翻译遵循 CC BY-SA 3.0 许可协议

一种可能更快的方法(因为您不需要一次删除每个值,而是一次删除所有值)是使用布尔掩码:

 values = np.array([0,1,2,3,4,5])
tobedeleted = np.array([False, True, False, True, False, True])
# So index 3, 5 and 1 are True so they will be deleted.
values_deleted = values[~tobedeleted]
#that just gives you what you want.

建议在 np.delete

对于你的问题:你删除了一个元素,所以数组变短了,索引 5 不再在数组中,因为以前的索引 5 现在索引 4。如果你想使用 np.delete,按降序删除。

如果你真的想删除 np.delete 使用速记:

 np.delete(values, [3,5,1])

如果你想删除值所在的位置(不是索引),你必须稍微改变程序。如果你想删除数组中的所有值 5 你可以使用:

 values[values != 5]

或具有多个要删除的值:

 to_delete = (values == 5) | (values == 3)  | (values == 1)
values[~to_delete]

所有这些都会给你想要的结果,但不确定你的数据到底是什么样子的,所以我不能肯定地说哪个是最合适的。

原文由 MSeifert 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题