我有一个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
嵌套循环是一种简单的方法。由于}分别包含半径值(与中间像素的差值)和用于旋转的数组,我建议:
ri_data_r
和{这会给你你想要的东西。您只需接受数组并计算一个对称数组
ri_data_r
,它与数据数组的长度相同,并且包含实际数据和数组中间的距离。代码会自动执行此操作。在相关问题 更多 >
编程相关推荐