python - 将集合转换为 numpy 0-1 数组?

标签 python numpy set

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

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

这里nwords可以大到10000。

每次我可以将 wordMask 保留为单独的变量时,并且每当我从 words 添加/删除元素时,我都会对 进行相应的更改,而不是重新计算 wordMask wordMask,但我想知道是否有一种相当有效的方法来重新计算 wordMask

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

[ x not in words for x in xrange(0,nwords) ]

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

最佳答案

让我们从这个示例代码开始:

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 代码,从一开始就自动 reshape 它的形状。现在您已经有了单词掩码,每当您添加或删除单词时就可以轻松更新。

添加一个词:

newWord = 4
words.add(newWord)
nwords = len(words)
wordMask = np.concatenate((wordMask, [[1]])) # Resize the mask
if newWord < nwords:                         # Update the mask
    wordMask[newWord][0] = 0 

删除一个单词:

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() 和 resize() 方法不一定很快。一种选择是将掩码设置为固定大小(上限)并在发生变化时进行更新。这样效率会高得多。

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

关于python - 将集合转换为 numpy 0-1 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45652569/

相关文章:

numpy - 从 Cython 调用 PyArray_SearchSorted——3 或 4 个参数?

mysql - 如何在指定时间重复 MySQL 结果集中的一行?

python - 文本中关键字的精确命中集

python - Python中递归遍历所有目录,直到找到某个文件

python - 如何更改字典的键和值

python - 在 hdfs 中运行顺序代码

c++ - 将 std::set 传递给 C++ 中的方法

python - 在索引数组 Numpy 中广播

numpy - numpy.logical_and 和 & 的区别

python - 如何矢量化循环遍历 3D 点数组的 python 函数?