我想获取一个大的二维数组,并通过插入子块(读取:较小的二维数组)来填充值,直到填充大数组。我想尽快完成此操作,因此我尝试使用我认为的 c 数组。但我是 cython 的初学者。所以这是一个最小的非工作示例来解释我想做的事情:
# test.pyx
import numpy as np
cimport numpy as cnp
cnp.import_array()
def HGamma_m( int L, double[:] param, cnp.ndarray[int64_t, ndim=2] R ):
cdef complex [:,:] HGamma = np.zeros( (4*L,4*L) , dtype=np.complex128 )
cdef int i, j
cdef double l,m,n
for i in range(L):
for j in range(L):
r = R[j] - R[i]
l,m,n = r[0], r[1], r[2]
HGamma[4*i:4*(i+1), 4*j:4*(j+1)] = [
[ bowler*param[2], bowler*param[3]*l, bowler*param[3]*m, bowler*param[3]*n],
[-bowler*param[3]*l, bowler*param[4]*l*l + bowler*param[5]*(1-l*l ), bowler*m*l*(param[4]-param[5]), bowler*n*l*(param[4] - param[5])],
[-bowler*param[3]*m, bowler*l*m*(param[4] - param[5]), bowler*param[4]*m*m + bowler*param[5]*(1-m*m), bowler*n*m*(param[4] - param[5])],
[-bowler*param[3]*n, bowler*l*n*(param[4] - param[5]), bowler*m*n*(param[4]-param[5]), bowler*param[4]*n*n + bowler*param[5]*(1-n*n)]
]
可以使用以下代码进行编译。
# setup.py
from setuptools import setup
from Cython.Build import cythonize
import numpy
setup(
ext_modules = cythonize(
"test.pyx",
annotate=True,
compiler_directives={'language_level' : "3"}
),
include_dirs=[numpy.get_include()]
)
但是我收到错误,它
Cannot coerce list to type 'double complex'
位于以HGamma[4*i:4*(i+1), 4*j:4*(j+1)] = [
开头的行上。
那么我如何以最快的实际方式实现这一目标?
我尝试将数组声明为 numpy 数组,这有效。但随后我发现随着
L
值的增加,执行速度似乎不公平地缓慢。因此,我想更快地完成这些简单的算术运算。
作为
cythonize
Cannot coerce list to type 'double complex'
,你可以通过写来帮助它
HGamma[4*i:4*(i+1), 4*j:4*(j+1)] = np.array([
[ bowler*param[2], bowler*param[3]*l, bowler*param[3]*m, bowler*param[3]*n],
[-bowler*param[3]*l, bowler*param[4]*l*l + bowler*param[5]*(1-l*l ), bowler*m*l*(param[4]-param[5]), bowler*n*l*(param[4] - param[5])],
[-bowler*param[3]*m, bowler*l*m*(param[4] - param[5]), bowler*param[4]*m*m + bowler*param[5]*(1-m*m), bowler*n*m*(param[4] - param[5])],
[-bowler*param[3]*n, bowler*l*n*(param[4] - param[5]), bowler*m*n*(param[4]-param[5]), bowler*param[4]*n*n + bowler*param[5]*(1-n*n)]
])