我有一本字典
{'A': 0, 'B': 1, 'C': 2, 'D': 3, etc}
Run Code Online (Sandbox Code Playgroud)
如果未对字典进行排序,如何在不创建值的间隙的情况下从此字典中删除元素?
一个例子:
我有一个大矩阵,其中行代表单词,列代表遇到这些单词的文档.我将单词及其相应的索引存储为字典.例如,这个矩阵
2 0 0
1 0 3
0 5 1
4 1 2
Run Code Online (Sandbox Code Playgroud)
字典看起来像:
words = {'apple': 0, 'orange': 1, 'banana': 2, 'pear': 3}
Run Code Online (Sandbox Code Playgroud)
如果我删除的话'apple'和'banana',矩阵将只包含两行.所以'orange'字典中的值现在应该相等0而不是1,而值'pear'应该是1而不是3.
在Python 3.6+字典是有序的,所以我可以写这样的东西来重新分配值:
i = 0
for k, v in words.items():
v = i
i += 1
Run Code Online (Sandbox Code Playgroud)
或者,或者
words = dict(zip(terms.keys(), range(0, matrix.shape[0])))
Run Code Online (Sandbox Code Playgroud)
我认为,这远不是改变价值观的最有效方式,它不适用于无序词典.如何有效地做到这一点?如果没有订购字典,有没有办法轻松重新分配值?
我有一对整数对的向量,看起来像这样:
(0, 1)
(1, 9)
(2, 3)
(6, 1)
(4, 0)
Run Code Online (Sandbox Code Playgroud)
我想从那里提取独特的元素,因此结果如下所示:(
??0?, 1, 9, 2, 3, 6, 4
基本上只是所有数字都没有重复)
目前我正是这样做的:
std::vector<int> getElements(std::vector<std::pair<int, int>> S) {
std::vector<int> V;
for (std::vector<std::pair<int, int>>::iterator i = S.begin(); i != S.end(); i++) {
if (std::find(V.begin(), V.end(), i->first) == V.end()) {
V.push_back(i->first);
}
if (std::find(V.begin(), V.end(), i->second) == V.end()) {
V.push_back(i->second);
}
}
return V;
}
Run Code Online (Sandbox Code Playgroud)
有没有更有效的方法呢?
我有几个不同类型的变量存储在字符数组中。通常我会这样将它们写入数组:
int a = 5;
memcpy(offset, (char*)&a, sizeof(int))
Run Code Online (Sandbox Code Playgroud)
但是,memcpy 在 OpenCL 内核中不起作用。如果没有这个功能,最简单的方法是什么?
我正在考虑在 GPU 上处理数据的可能性,这对于 GPU 内存来说太大了,我有几个问题。
如果我理解正确的话,使用映射内存,数据驻留在主内存中,并且仅在访问时才传输到 GPU,因此分配超出 GPU 内存的数据应该不成问题。
UVA与映射内存类似,但数据可以存储在CPU和GPU内存中。但是 GPU 是否有可能在充满自己的数据的情况下访问主内存(与映射内存一样)?这种情况下会不会发生内存溢出呢?我读到,使用映射内存,数据直接进入本地内存,而无需先传输到全局内存,在这种情况下,不应该有任何溢出。这是真的吗?如果是的话,UVA 也是如此吗?
在 CUDA 6.0 中,UM 不允许超额订阅 GPU 内存(并且通常不允许分配比 GPU 多的内存,即使在主内存中也是如此),但在 CUDA 8.0 中这成为可能(https://devblogs .nvidia.com/parallelforall/beyond-gpu-memory-limits-unified-memory-pascal/)。我做对了吗?
OpenCL最佳实践指南(https://www.cs.cmu.edu/afs/cs/academic/class/15668-s11/www/cuda-doc/OpenCL_Best_Practices_Guide.pdf)建议在3.1.3节中使用clFlush以确保命令以正确的顺序发生,例如在数据传输之前不会发生处理:
clFlush 对于queue0clFlush 对于queue0和queue1clFlush 对他们两个这里的回复/sf/answers/867279941/建议使用事件来实现,看起来是一样的.
我的问题是:我是否做对了,并且clFlush在这种情况下两者都做了同样的事情(避免同时执行)?使用哪一个是否重要?
我有一个包含三列的表:user_id,book_id和rating。因此,一行显示用户对一本书的评分。
我正在尝试删除与评分少于 10 本书的用户相对应的行。我做了一些类似于这个问题的答案中描述的内容Remove low frequency values from pandas.dataframe。这是我的代码:
threshold = 10
value_counts = ratings['user_id'].value_counts()
to_remove = value_counts[value_counts <= threshold].index
ratings.drop(to_remove, axis=0, inplace=True)
Run Code Online (Sandbox Code Playgroud)
当我运行它时,在最后一行出现错误:
ValueError: labels [40518 21743 30824 <...> 47178 46308 30460] not contained in axis
Run Code Online (Sandbox Code Playgroud)
该表有 979478 行,因此应该存在具有这些索引的行。我究竟做错了什么?