我有一个包含元组的numpy数组:
trainY = np.array([('php', 'image-processing', 'file-upload', 'upload', 'mime-types'),
('firefox',), ('r', 'matlab', 'machine-learning'),
('c#', 'url', 'encoding'), ('php', 'api', 'file-get-contents'),
('proxy', 'active-directory', 'jmeter'), ('core-plot',),
('c#', 'asp.net', 'windows-phone-7'),
('.net', 'javascript', 'code-generation'),
('sql', 'variables', 'parameters', 'procedure', 'calls')], dtype=object)
我得到了一个索引列表,它可以将这个np.array分成子集:
x = [0, 4]
以及一个字符串:
label = 'php'
我希望能够统计出在这个 np.array 的子集中标签 'php'
出现的次数。在这种情况下,答案是2。
注意:
1)一个标签最多只会出现一次;
2)元组的长度可以为 1 到 5;
3)列表 x
的长度通常为 7-50;
4)trainY
的长度约为 80 万。
我目前用以下代码来实现:
sum([1 for n in x if label in trainY[n]])
这是我程序当前的性能瓶颈,我正在寻找一种方法使其运行更快。我认为我们可以跳过对x
的循环,只需像trainY[x]
这样进行矢量化查找trainY
,但我无法得到有效的结果。
谢谢。
trainY
进行多次计算? 你可以考虑对trainY
进行一些预处理。 - levtrainY
是相同的。变化的是label
和索引x
。 - mchangunsum(label in words for words in trainY[x])
。(我不知道这是否会对性能产生太大影响。) - Warren Weckesserx
的长度很小。求和应该立即计算。如果它是您程序中的瓶颈,这意味着您要多次计算总和。请为代码提供上下文。您可能会在那里找到优化机会。如果您删除sum()
调用并将其替换为虚拟常量,您的程序会快多少? - jfs