小编law*_*ral的帖子

重新分配字典值

我有一本字典

{'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)

我认为,这远不是改变价值观的最有效方式,它不适用于无序词典.如何有效地做到这一点?如果没有订购字典,有没有办法轻松重新分配值?

python dictionary

10
推荐指数
1
解决办法
861
查看次数

从对矢量中获取唯一元素的有效方法

我有一对整数对的向量,看起来像这样:

(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)

有没有更有效的方法呢?

c++ vector std

4
推荐指数
1
解决办法
1428
查看次数

不使用 memcpy 复制字节

我有几个不同类型的变量存储在字符数组中。通常我会这样将它们写入数组:

int a = 5;
memcpy(offset, (char*)&a, sizeof(int))
Run Code Online (Sandbox Code Playgroud)

但是,memcpy 在 OpenCL 内核中不起作用。如果没有这个功能,最简单的方法是什么?

c memcpy opencl

3
推荐指数
1
解决办法
1624
查看次数

具有映射内存、统一虚拟寻址和统一内存的 GPU 内存超额认购

我正在考虑在 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/)。我做对了吗?

cuda gpgpu mapped-memory unified-memory cuda-uva

2
推荐指数
1
解决办法
2040
查看次数

重叠传输和执行:确保以正确的顺序执行命令

OpenCL最佳实践指南(https://www.cs.cmu.edu/afs/cs/academic/class/15668-s11/www/cuda-doc/OpenCL_Best_Practices_Guide.pdf)建议在3.1.3节中使用clFlush以确保命令以正确的顺序发生,例如在数据传输之前不会发生处理:

  1. 传输queue0的数据
  2. clFlush 对于queue0
  3. 运行queue0的内核,传输queue1的数据
  4. clFlush 对于queue0和queue1
  5. 运行queue1的内核并检索queue0的数据
  6. clFlush 对他们两个
  7. 检索queue1的数据

这里的回复/sf/answers/867279941/建议使用事件来实现,看起来是一样的.

我的问题是:我是否做对了,并且clFlush在这种情况下两者都做了同样的事情(避免同时执行)?使用哪一个是否重要?

gpgpu opencl

2
推荐指数
1
解决办法
112
查看次数

在数据框中删除行:轴中不包含标签

我有一个包含三列的表:user_id,book_idrating。因此,一行显示用户对一本书的评分。

我正在尝试删除与评分少于 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 行,因此应该存在具有这些索引的行。我究竟做错了什么?

python pandas

1
推荐指数
1
解决办法
866
查看次数

标签 统计

gpgpu ×2

opencl ×2

python ×2

c ×1

c++ ×1

cuda ×1

cuda-uva ×1

dictionary ×1

mapped-memory ×1

memcpy ×1

pandas ×1

std ×1

unified-memory ×1

vector ×1