Cython:将单个元素分配给多维内存视图切片

时间:2019-05-02 20:14:53

标签: python python-3.x slice cython memoryview

每当我为多维内存视图的一个切片分配单个值时,Cython似乎都会使用错误的跨步,除非该切片沿第一个维度。我在下面给出一个完整的例子:

# bug.py
import numpy as np

def bug():
    #cdef int[:, ::1] a
    a = 2*np.ones((2, 2), dtype=np.intc)
    a[:, :1] = 1
    print(np.asarray(a))

如果我们使用Python(例如python3 -c 'import bug; bug.bug()')运行此代码,则会得到

[[1 2]
 [1 2]]

按预期打印。现在,我将文件重命名为bug.pyx,并使用Cython进行了编译,并将以下文件保存在同一目录的Makefile

# Makefile
python = python3
python_config = $(python)-config
CC = gcc
CFLAGS  = $(shell $(python_config) --cflags) -fPIC
CFLAGS += $(shell $(python_config) --includes)
python_libdir = $(shell $(python) -c "import sysconfig; \
    print(sysconfig.get_config_var('LIBDIR'));")
LDLIBS  = -L$(python_libdir) -Wl,-rpath=$(python_libdir)
LDLIBS += $(shell $(python_config) --libs)
LDFLAGS = $(shell $(python_config) --ldflags) -shared

bug.so: bug.c; $(CC) $(CFLAGS) $(LDFLAGS) $(LDLIBS) -o bug.so bug.c
bug.c: bug.pyx; $(python) -m cython -3 $<

并运行make。现在再次运行python3 -c 'import bug; bug.bug()',它会拾取编译后的bug.so,并再次打印出

[[1 2]
 [1 2]]

如果我们现在取消注释cdef声明,再次运行makepython3 -c 'import bug; bug.bug()',我们将得到

[[1 1]
 [2 2]]

这是错误的。我不相信int[:, ::1]声明是错误的,因为Cython会抱怨。如果我仅用int[:, :]替换它,它将起作用。另外,如果我将aa[:1, :] = 1的第一个维度赋给它,则可以使用。

这是一个已知问题,还是我以某种方式误解了Cython内存视图的这种看似基本用法?

1 个答案:

答案 0 :(得分:1)

我提交了bug report,此后一直是fixed