jmd*_*_dk 8 python cython slice python-3.x 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))
Run Code Online (Sandbox Code Playgroud)
如果我们在Python中运行此代码(例如python3 -c 'import bug; bug.bug()'),我们将得到
[[1 2]
[1 2]]
Run Code Online (Sandbox Code Playgroud)
按预期打印。现在,通过将文件重命名为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 $<
Run Code Online (Sandbox Code Playgroud)
然后跑make。python3 -c 'import bug; bug.bug()'现在再次运行,将拾取已编译的bug.so,然后再次打印出
[[1 2]
[1 2]]
Run Code Online (Sandbox Code Playgroud)
如果我们现在取消注释cdef声明,运行make和python3 -c 'import bug; bug.bug()'再次,我们得到
[[1 1]
[2 2]]
Run Code Online (Sandbox Code Playgroud)
这是错误的。我不认为int[:, ::1]声明有误,因为Cython会抱怨。如果我用它代替int[:, :]它就可以了。另外,如果我分配到的第一个维度a,a[:1, :] = 1,它的工作原理。
这是一个已知问题,还是我以某种方式误解了Cython内存视图的这种看似基本用法?
| 归档时间: |
|
| 查看次数: |
244 次 |
| 最近记录: |