用Python中的CountinCells在3D星场中进行聚类

2024-05-16 10:32:52 发布

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

第一次发帖,找不到任何能完全解决我问题的东西。在

我正在为我的硕士项目做银河系殖民模拟。我想做的一件事是,在模拟结束后,观察未被聚集的恒星的空洞,看看统计波动后是否存在聚集行为。由于这是一个monte-carlo数值问题,相关函数并不是很合适,所以我使用了通常用来观察星系团的细胞计数方法。在

所以我在卡特尔西亚工作

data = np.genfromtxt('counts.csv') # positions of uncolonsed stars
x = data[:,0]
y = data[:,1]
z = data[:,2]

我想做的是用不同大小的盒子来计算盒子里的星星数量,并与平均值进行比较,然后对结果进行统计。在

我要看的是一些3D直方图,比如看到的气泡图here。我试了一下,它似乎并没有把我所有的数据都存储起来,我也不知道为什么,也就是说,立方体的“地板”有“泡泡”,但“屋顶”的大部分却什么都没有:

3D Bubble Histogram

很明显,当你看到这颗未加工的恒星时

Plotted star field

看起来,z值较高的箱子没有保存任何数据。这可能是一个相当直接的问题,但我需要一些比我更擅长python的新鲜眼睛和头脑。在

有人能想到这是怎么解决的吗?另外,我想找到一种方法来计算每个盒子的点数,即每个箱子。在

很抱歉,如果我有点糊涂,但我很感激你们中任何一个优秀的家伙能给我的任何帮助。在

谢谢朋友们!在


Tags: 数据项目方法函数data数值盒子monte
1条回答
网友
1楼 · 发布于 2024-05-16 10:32:52

在评论中,你有一些解决问题的方法,很难在没有看到的情况下说出你的代码有什么问题。在任何情况下,这类问题通常是通过计算规则网格内的数据来解决的(尽管如此,这是一种绘制直方图的通用方法)。在

构建自己的网格的好处是,您可以立即知道每个“扇区”在哪里,从哪里开始,从哪里结束。因此,如果你想试试的话,我建议用下面的方法作为替代。在

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

# Generating some random data.
data = np.random.randint(0, 100, (1000,3))
x, y, z = data[:, 0], data[:, 1], data[:, 2]

# Generating raw view
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z, marker='+', s=25, c='r')
plt.show()

# Generating some grid with origin, cell size, and number of cells 10 10 10
numx, numy, numz = 5, 5, 5
origx, origy, origz = 0, 0, 0
sizex, sizey, sizez = 20, 20, 20
grid = np.vstack(np.meshgrid(range(numx), range(numy), range(numz))).reshape(3, -1).T
gx, gy, gz = grid[:, 0]*sizex + origx, grid[:, 1]*sizey + origy, grid[:, 2]*sizez + origz

# Calculating the number of stars in each cell:
ix = ((x - origx)/sizex).astype(int)
iy = ((y - origy)/sizey).astype(int)
iz = ((z - origz)/sizez).astype(int)
s = np.zeros((numx, numy, numz))
for i in range(ix.shape[0]):
    s[ix[i], iy[i], iz[i]] = s[ix[i], iy[i], iz[i]] + 1
s = s.flatten()
mask = s > 0

# Plotting the result
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(gx[mask], gy[mask], gz[mask], marker='o', s=s[mask]*100, c='b', edgecolor ="r")
plt.show()

随机数据的结果如下:

bubble histogram in matplotlib

相关问题 更多 >