将一维辐射强度阵列旋转为二维空间强度阵列

2024-09-27 00:21:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个numpy阵列,在一个统一的圆内充满了不同半径的强度读数(就上下文而言,这是一个用于原恒星形成模型的一维辐射传输项目:虽然有更好的模型存在,但我的主管不让我有生产一个模型的经验,以便我了解其他模型是如何工作的)。

我想把这个1d数组,通过一个圆“旋转”,形成一个强度的2D数组,然后用imshow(或者,稍加努力,aplpy)显示出来。最终的阵列需要是二维的,投影需要是笛卡尔坐标,而不是极坐标。

我可以用嵌套的for循环来实现,也可以用查找表来实现,但是我有一种感觉,一定有一种在numpy或其他东西中实现的简洁方法。

有什么想法吗?

编辑:

我不得不回去重新创建我以前的for循环和if语句。如果我真的试过了,我可能可以通过压缩来去掉一个循环和一个If语句。但是,我们的目标不是让它与for循环一起工作,而是看看是否有内置的方法来旋转数组。 impB是一个数组,与我之前所说的略有不同。它实际上只是检测到粒子的半径列表。如果你喜欢的话,把强度和半径都放进箱子里。R是以无量纲方式运行模型时半径的比例因子。iRes是一个分辨率比例因子,本质上是我想对径向容器进行采样的频率。其他一切都应该清楚。

radJ = np.ndarray(shape=(2*iRes, 2*iRes))    # Create array of 2xRadius square

for i in range(iRes):
    n = len(impB[np.where(impB[:] < ((i+1.) * (R / iRes)))])    # Count number of things within this radius +1
    m = len(impB[np.where(impB[:] <= ((i) * (R / iRes)))])      # Count number of things in this radius
    a = (((i + 1) * (R / iRes))**2 - ((i) * (R / iRes))**2) * math.pi    # A normalisation factor based on area.....dont ask
    for x in range(iRes):
        for y in range(iRes):
            if (x**2 + y**2) < (i * iRes)**2:
                if (x**2 + y**2) >= (i * iRes)**2:    # Checks for radius, and puts in cartesian space
                    radJ[x+iRes,y+iRes] = (n-m) / a    # Put in actual intensity bins
                    radJ[x+iRes,-y+iRes] = (n-m) / a
                    radJ[-x+iRes,y+iRes] = (n-m) / a
                    radJ[-x+iRes,-y+iRes] = (n-m) / a

Tags: ofin模型numpyforifnp半径
1条回答
网友
1楼 · 发布于 2024-09-27 00:21:22

嵌套循环是一种简单的方法。由于ri_data_r和{}分别包含半径值(与中间像素的差值)和用于旋转的数组,我建议:

from scipy import interpolate
import numpy as np
y = np.random.rand(100)
ri_data_r = np.linspace(-len(y)/2,len(y)/2,len(y))
interpol_index = interpolate.interp1d(ri_data_r, y)
xv = np.arange(-1, 1, 0.01) # adjust your matrix values here
X, Y = np.meshgrid(xv, xv)
profilegrid = np.ones(X.shape, float)
for i, x in enumerate(X[0, :]):
    for k, y in enumerate(Y[:, 0]):
        current_radius = np.sqrt(x ** 2 + y ** 2)
        profilegrid[i, k] = interpol_index(current_radius)
print(profilegrid)

这会给你你想要的东西。您只需接受数组并计算一个对称数组ri_data_r,它与数据数组的长度相同,并且包含实际数据和数组中间的距离。代码会自动执行此操作。在

相关问题 更多 >

    热门问题