如何将多维数组分配给二维数组的子块

问题描述 投票:0回答:1

我想获取一个大的二维数组,并通过插入子块(读取:较小的二维数组)来填充值,直到填充大数组。我想尽快完成此操作,因此我尝试使用我认为的 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
值的增加,执行速度似乎不公平地缓慢。因此,我想更快地完成这些简单的算术运算。

arrays optimization multidimensional-array cython typed-arrays
1个回答
0
投票

作为

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)]
            ])
© www.soinside.com 2019 - 2024. All rights reserved.