从 numpy 数组中删除 None 的有效方法

Posted

技术标签:

【中文标题】从 numpy 数组中删除 None 的有效方法【英文标题】:efficient way of removing None's from numpy array 【发布时间】:2014-10-04 23:15:46 【问题描述】:

有没有一种有效的方法可以从 numpy 数组中删除 None 并将数组调整为新的大小?

例如,如何在不通过 python 迭代的情况下从该帧中删除 None 。我可以轻松地遍历它,但正在处理一个可能会被多次调用的 api 调用。

a = np.array([1,45,23,23,1234,3432,-1232,-34,233,None])

【问题讨论】:

您希望将 None 替换为什么?或者你想删除None,然后调整数组的大小? 我想删除 None 并调整数组的大小。 efficient filter of an array with numpy 的可能重复项 != 比过滤器高效得多 另外,你不能像前面的例子那样做!= None 【参考方案1】:
In [17]: a[a != np.array(None)]
Out[17]: array([1, 45, 23, 23, 1234, 3432, -1232, -34, 233], dtype=object)

上述方法有效,因为a != np.array(None) 是一个布尔数组,它映射出非无值:

In [20]: a != np.array(None)
Out[20]: array([ True,  True,  True,  True,  True,  True,  True,  True,  True, False], dtype=bool)

以这种方式选择数组元素称为boolean array indexing。

【讨论】:

如果你不介意我问,如果数组中有n个项目,这个方法比O(n)快吗? 这在大型阵列上节省了我 80% 的时间 @wookie919 如果我正确理解了 numpy 的内部结构,这就是复制数组,并一一删除 None 。所以,我不这么认为。 但其中大部分将存在于 C 中。它比过滤器快得多 在访问(索引)运算符中使用比较是否有名称?就像访问器中的冒号被称为切片一样。【参考方案2】:

我使用以下我认为比接受的答案更简单的方法:

a = a[a != None]

警告:PEP8 警告不要将相等运算符用于单例,例如 None。当我发布这个答案时,我不知道这一点。也就是说,对于 numpy 数组,我觉得这太 Pythonic 了,而且很漂亮,不能使用。请参阅 cmets 中的讨论。

【讨论】:

虽然它更简单,但这不适用于像 flake8 这样的 PEP8 自动格式化程序,它希望将 a[a != None] 转换为 a[a is not None](这在语义上不等效)。 PEP8 中没有关于不使用 != 的内容,我已经看到了。考虑一下:有时它倾向于使用is,其他时候==。同样,有时您需要!=,有时需要is not。你只需要知道你在做什么。另请注意,此问题/答案与 numpy 数组有关——对于 Python 列表,您需要其他内容。 来自PEP8 - “与像 None 这样的单例的比较应该总是用 is 或 not 来完成,而不是相等运算符。”。我知道这是在谈论 numpy,而不是 Python 列表。 你的答案是我过去一直这样做......直到我们开始在我们的回购中使用 flake8(和 autopep8) - 这导致代码更改(有时自动)到 a = a[a is not None] 导致在一些奇怪的错误中。感谢您的链接 - 很好的讨论! @DavidSlater 我学到了一些关于 PEP8 的新知识,并在我的回答中添加了一个警告。谢谢!

以上是关于从 numpy 数组中删除 None 的有效方法的主要内容,如果未能解决你的问题,请参考以下文章

只有整数、切片 (`:`)、省略号 (`...`)、numpy.newaxis (`None`) 和整数或布尔数组是生成 rnn 的有效索引

只有整数、切片 (`:`)、省略号 (`...`)、numpy.newaxis (`None`) 和整数或布尔数组是有效的索引

RandomForest IndexError:只有整数、切片(`:`)、省略号(`...`)、numpy.newaxis(`None`)和整数或布尔数组是有效的索引

从一维 numpy 数组中获取这种矩阵的最有效方法是啥?

如何从 numpy nd 数组中删除特定元素?

附加numpy数组的有效方法