是否将集合转换为numpy 01数组?

2024-03-28 19:07:21 发布

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

我当前正在使用此方法将一组整数(变量words)转换为numpy数组:

    wordMask = np.asarray( [ int(x not in words)  for x in xrange(0,nwords) ] ).reshape(nwords,1)

这里nwords可以大到10000。在

我不是每次可以将wordMask作为一个单独的变量来重新计算wordMask,而是对wordMask进行相应的更改,但是我想知道是否有一种合理有效的方法来重新计算wordMask。在

编辑:我主要关心的是列表理解:

^{pr2}$

会很慢,我正在寻找一种更快的方法来执行迭代 在创建numpy数组的上下文中。在


Tags: 方法innumpyfornpnot整数数组
2条回答

让我们从下面的示例代码开始:

import numpy as np

words = set([1, 3, 5, 7, 9])
nwords = len(words)
wordMask = np.asarray([ [int(x not in words)] for x in xrange(0, nwords) ])

我更改了asarray代码,从一开始就自动改变它的形状。现在您已经有了单词掩码,所以无论何时添加或删除单词,都可以轻松地进行更新。在

添加单词:

^{pr2}$

删除单词:

oldWord = 3
if oldWord < nwords:                         # Update the mask
    wordMask[oldWord][0] = 1
words.discard(oldWord)
nwords = len(words)
wordMask = np.resize(wordMask, (nwords, 1))  # Resize the mask

就在这里!在

我会亲自用字典,因为它们更容易处理。我猜你选择使用NumPy来提高内存效率?NumPy总是在调整大小时复制数组,因此concatenate()和{}方法不一定很快。一种方法是将遮罩设置为固定大小(上限),并在发生任何变化时进行更新。那样会更有效率。在

如果保证最大大小为10000,那么从上面的代码中删除大小更新,并将nwords设置为10000。在

您可以尝试使用^{}。下面是一个用法示例:

>>> nwords = 10
>>> words = {1, 5, 3, 8, 6}
>>> import numpy
>>> numpy.bincount(list(s), minlength=nwords)  # words present
array([0, 1, 0, 1, 0, 1, 1, 0, 1, 0])
>>> 1 - numpy.bincount(list(s), minlength=nwords)  # words absent
array([1, 0, 1, 0, 1, 0, 0, 1, 0, 1])

不幸的是,这仍然涉及到对s元素的Python级迭代(在list调用中是隐式的)。我找不到比先将其转换为list更快的方法来让NumPy在这里解释集合。在

一些计时(使用Python 3.6、NumPy 1.13.1)显示,此解决方案速度更快,但并不令人难以置信:

^{pr2}$

相关问题 更多 >