python中的double 型数据_python – ‘*'(double [:: 1]; double [:: 1])的操作数类型无效

我在我的类中实例化了memoryviews,如下所示:

from __future__ import division

import numpy as np

import pylab as plt

cimport numpy as np

cimport cython

cdef class fit(object):

cdef public double[::1] shear_g1, shear_g2, shear_z, halo_pos_arcsec

cdef public double[:,::1] shear_pos_arcsec, source_zpdf

cdef char* path

cdef double omega_m, omega_l, h, sigma_g

@cython.boundscheck(False)

@cython.cdivision(True)

@cython.wraparound(False)

@cython.nonecheck(False)

def __init__(self, shear_g1, shear_g2, shear_pos_arcsec, shear_z, halo_pos_arcsec, double halo_z, source_zpdf, sigma_g, path=None, omega_m=None, omega_l=None, h=None ):

self.shear_g1 = shear_g1

self.shear_g2 = shear_g2

self.shear_pos_arcsec = shear_pos_arcsec

self.shear_z = shear_z

self.halo_pos_arcsec = halo_pos_arcsec

self.halo_z = halo_z

self.sigma_g = sigma_g

self.shear_zpdf= source_zpdf

if path is None:

raise ValueError("Could not find a path to the file which contains the table of angular diameter distances")

self.path = path

self.n_model_evals = 0

self.gaussian_prior_theta = [{'mean' : 14, 'std': 0.5}]

if omega_m is None:

self.omega_m=0.3

if omega_l is None:

self.omega_l=1-self.omega_m

if h is None:

self.h=1.

def plot(self, g1, g2):

emag=np.sqrt(g1**2+g2**2)

ephi=0.5*np.arctan2(g2,g1)

nuse=1

quiver_scale=10

plt.quiver(self.shear_pos_arcsec[::nuse,0], self.shear_pos_arcsec[::nuse,1], emag[::nuse]*np.cos(ephi)[::nuse], emag[::nuse]*np.sin(ephi)[::nuse], linewidths=0.001, headwidth=0., headlength=0., headaxislength=0., pivot='mid', color='r', label='original', scale=quiver_scale)

plt.xlim([min(self.shear_pos_arcsec[::nuse,0]),max(self.shear_pos_arcsec[::nuse,0])])

plt.ylim([min(self.shear_pos_arcsec[::nuse,1]),max(self.shear_pos_arcsec[::nuse,1])])

plt.axis('equal')

def plot_res(self, model_g1, model_g2, show=False):

res1 , res2 = self.shear_g1 - model_g1, self.shear_g2 - model_g2

emag_data=np.sqrt(self.shear_g1*self.shear_g1+self.shear_g2*self.shear_g1)

ephi_data=0.5*np.arctan2(self.shear_g2,self.shear_g1)

emag_res=np.sqrt(res1**2+res2**2)

ephi_res=0.5*np.arctan2(res2,res1)

emag_model=np.sqrt(model_g1**2+model_g2**2)

ephi_model=0.5*np.arctan2(model_g2,model_g1)

plt.figure()

plt.subplot(3,1,1)

self.plot(self.shear_g1,self.shear_g2)

plt.subplot(3,1,2)

self.plot(model_g1,model_g2)

plt.subplot(3,1,3)

self.plot(res1 , res2)

if show:

plt.show()

但是我收到了有关内存视图操作的错误消息.

Error compiling Cython file:

------------------------------------------------------------

...

def plot_res(self, model_g1, model_g2, show=False):

res1 , res2 = self.shear_g1 - model_g1, self.shear_g2 - model_g2

emag_data=np.sqrt(self.shear_g1*self.shear_g1+self.shear_g2*self.shear_g1)

^

------------------------------------------------------------

model.pyx:90:40: Invalid operand types for '*' (double[::1]; double[::1])

我想知道我应该如何对记忆视图进行数学运算?

最佳答案 正如评论中所提到的,您可以使用np.asarray()将内存视图临时转换为数组,而无需复制,但会增加一些开销.一个非常快速的解决方案是执行循环并在内存视图中以元素方式操作.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值