Python 3.x groupby的cython实现因NameError失败

Python 3.x groupby的cython实现因NameError失败,python-3.x,pandas-groupby,cython,Python 3.x,Pandas Groupby,Cython,我试图通过使用cython优化的函数来加速我打给pandas Group的几十个电话。这些包括直接分组、排名分组和其他。我有一个groupby,它在我的笔记本中运行,但当我被调用时,我会得到一个NameError 这是我笔记本上的测试代码(在3个单元格中) 我得到的错误是: <ipython-input-20-3f8635aec47f> in group_by(keys) 4 indices = [[] for _ in range(max(keys_as_int) +

我试图通过使用cython优化的函数来加速我打给pandas Group的几十个电话。这些包括直接分组、排名分组和其他。我有一个groupby,它在我的笔记本中运行,但当我被调用时,我会得到一个NameError

这是我笔记本上的测试代码(在3个单元格中)

我得到的错误是:

<ipython-input-20-3f8635aec47f> in group_by(keys)
  4     indices = [[] for _ in range(max(keys_as_int) + 1)]
  5     print(str(keys_as_int) + str(n_keys) + str(indices))
 ----> 6     indices = _set_indices(keys_as_int, n_keys)
      7     return indices

NameError: name '_set_indices' is not defined
组中的
(按键)
4个索引=[]表示范围内的(最大值(键为int)+1)]
5打印(str(键+索引)+str(n键)+str(索引))
---->6个索引=_集合_索引(键为_int,n个键)
7回报指数
名称错误:未定义名称“\u集合\u索引”
有人能解释一下这是因为笔记本还是我用cython的方式出了问题,我是新手


此外,最欢迎使用具有最小缓存命中率的强类型解决方案的任何提示。

您需要将
\u set\u index
函数放在同一单元格中,或者需要显式导入它。从:

请注意,每个单元将编译成一个单独的扩展模块

编译后,您确实有一个全局名称
\u set\u index
,但这并不能使它在
group\u by()
函数的单独扩展模块中作为全局名称可用

您需要将两个函数定义放在同一个单元格中,或者为实用程序函数创建单独的模块

请注意,代码还有另一个问题;不能仅从整数列表创建类型化内存视图:

Traceback (most recent call last):
  File "so58378716.pyx", line 22, in init so58378716
    result = group_by(['1', '2', '3', '1', '3'])
  File "so58378716.pyx", line 19, in so58378716.group_by
    indices = _set_indices(keys_as_int, n_keys)
  File "so58378716.pyx", line 6, in so58378716._set_indices
    cdef object[:, :] indices = [[i for i in range(0)] for _ in range(n_keys)]
  File "stringsource", line 654, in View.MemoryView.memoryview_cwrapper
  File "stringsource", line 349, in View.MemoryView.memoryview.__cinit__
TypeError: a bytes-like object is required, not 'list'

您必须创建一个实际的numpy数组,或者使用,或。

我已经为上面的
\u set\u索引添加了声明函数。但是我正在努力使数组。数组索引初始化工作正常。根据文档说明,数组只能支持基本值,即不能支持数组。@Olddave:nope,因此不能使用数组创建任意长度的嵌套结构。你也不能在numpy中这样做,所以你的整个前提是有缺陷的。@Olddave:听起来你好像想阅读。那么我可以计算出所包含数组的最大长度,并使用三维数组来执行我的排名功能吗?@Olddave:我不知道你想用这个groupy函数做什么,对不起。对不起,请不要只是更改问题,如果您有新问题,您可以发布另一个问题。而且您不能只添加一个调用
\u set\u index()
的新函数
set\u inidices()
,而只是将问题转移到包含
group\u by()
的单元格中缺少的名称。
Traceback (most recent call last):
  File "so58378716.pyx", line 22, in init so58378716
    result = group_by(['1', '2', '3', '1', '3'])
  File "so58378716.pyx", line 19, in so58378716.group_by
    indices = _set_indices(keys_as_int, n_keys)
  File "so58378716.pyx", line 6, in so58378716._set_indices
    cdef object[:, :] indices = [[i for i in range(0)] for _ in range(n_keys)]
  File "stringsource", line 654, in View.MemoryView.memoryview_cwrapper
  File "stringsource", line 349, in View.MemoryView.memoryview.__cinit__
TypeError: a bytes-like object is required, not 'list'