运行CuPy示例代码遇dtype属性错误,求无cudf修改方案
问题
运行以下代码时出现AttributeError: 'list' object has no attribute 'dtype'错误,无法使用cudf,需要修改代码解决:
import cupy as cp import pandas as pd arr = [{'df1': pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}), 'df2': pd.DataFrame({'C': [7, 8, 9], 'D': [10, 11, 12]})}, {'df1': pd.DataFrame({'A': [2, 3, 4], 'B': [5, 6, 7]}), 'df2': pd.DataFrame({'C': [8, 9, 10], 'D': [11, 12, 13]})}] def my_calculation(d): df1 = d['df1'] df2 = d['df2'] return df1.groupby('A').mean() + df2.groupby('C').mean() my_vec_calculation = cp.vectorize(my_calculation) result = my_vec_calculation(arr) print(result)
错误信息:
return arg.dtype.char ^^^^^^^^^ AttributeError: 'list' object has no attribute 'dtype'
解决方案
问题根源
cp.vectorize是为CuPy/numpy数组设计的工具,要求输入必须是带有dtype属性的数组类型,而你传入的是Python原生列表,列表没有dtype属性,因此触发错误。另外,你的函数返回的是Pandas DataFrame,这类非数值数组的输出也不在cp.vectorize的处理范围内。
修复代码
直接用Python列表推导式遍历处理列表中的每个元素即可,这是适配当前数据结构最直接的方式:
import pandas as pd arr = [{'df1': pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}), 'df2': pd.DataFrame({'C': [7, 8, 9], 'D': [10, 11, 12]})}, {'df1': pd.DataFrame({'A': [2, 3, 4], 'B': [5, 6, 7]}), 'df2': pd.DataFrame({'C': [8, 9, 10], 'D': [11, 12, 13]})}] def my_calculation(d): df1 = d['df1'] df2 = d['df2'] return df1.groupby('A').mean() + df2.groupby('C').mean() # 遍历处理每个元素 result = [my_calculation(item) for item in arr] # 打印结果 for idx, res in enumerate(result): print(f"Result {idx+1}:") print(res) print("-"*30)
额外说明
如果后续需要利用CuPy加速数值运算,可以在my_calculation内部将DataFrame的数值列转换为CuPy数组进行计算,再转回Pandas对象,但当前场景下无需引入CuPy,直接用Python原生遍历就足够高效。
内容的提问来源于stack exchange,提问作者Zanam
相关产品推荐
相关产品推荐

