问题描述
我编写了一个 python 程序,在该程序中,我需要检查给定值是否在给定数据集的列中。为此,我需要遍历每一行并检查每一行中列的相等性。这需要很多时间,因此我想在 GPU 中运行它。我有 CUDA C/C++ 的经验,但没有 PyCuda 的并行化经验。谁能帮我解决这个问题?
C:\Program Files>javac HelloWorld.java
HelloWorld.java:1: error: error while writing HelloWorld: C:\Program Files\HelloWorld.class
public class HelloWorld {
^
1 error
C:\Program Files>
注意:这是我程序的一部分。我只想并行化这个 部分使用 GPU。
提前致谢。
解决方法
这种方法的动机是为了摆脱 df.iterrows
范式,因为它的速度相对较低。虽然有可能拆分成一个 dask
数据帧并执行某种并行的 apply
函数,但我认为由于 Numpy/Pandas 向量化操作的性能优势(如下所示),向量化方法是可以接受的.
我解释这段代码的方式基本上是“在 prop
列中,如果变量 temp
在该列的列表中,则将 prop
列设置为 's'
”。
for index,row in df.iterrows():
s1 = set(df.iloc[index]['prop'])
if temp in s1:
df.iat[index,df.columns.get_loc('prop')] = 's'
我构建了一个测试数据框:
df = pd.DataFrame({'temp': ['re'] * 7,'prop': [['re','a'],['ad','ed'],['see','contra'],['loc','idx'],['reader','pandas'],['alpha','omega'],['a','z']]})
然后爆炸以获取 temp
与 prop
子列表元素的所有可能组合。在每个结果组中,我使用 any
进行聚合,并将其用作掩码键,用 prop
替换相应的 's'
索引。
>>> df['result'] = df['prop'].explode().eq(df['temp']).reset_index().groupby('index').any()
>>> df['prop'] = df['prop'].mask(df['result'],'s')
>>> # df['prop'] = np.where(df['result'],'s',df['prop']) # identical operation
temp prop result
0 re s True
1 re [ad,ed] False
2 re [see,contra] False
3 re [loc,idx] False
4 re [reader,pandas] False
5 re [alpha,omega] False
6 re [a,z] False
此答案对于 temp
列中的逐行更改以及 prop
子列表中(相对任意)数量的元素是稳健的。也就是说,如果您的数据很大,您应该首先进行子集化以尽量减少内存使用。仅选择适用的列然后执行。
另请注意,df['prop'].explode().eq(df['temp'])
有效,因为 temp
列在索引上广播到展开的 prop
列。