【问题标题】:Clustering in a 3D star-field using Count-in-Cells in Python在 Python 中使用 Count-in-Cells 在 3D 星域中进行聚类
【发布时间】:2017-04-24 20:03:16
【问题描述】:

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

我正在为我的硕士项目进行银河殖民模拟。我正在尝试做的一件事是查看模拟结束后剩余的未殖民恒星的空隙,并查看统计波动后是否存在聚类行为。由于这是一个蒙特卡罗数值问题,相关函数并不合适,所以我使用通常用于观察星系团的细胞计数法。

所以我在笛卡尔工作

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

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

我要研究的方向是查看某种 3D 直方图,例如看到的气泡图 here。我试过了,它似乎并没有合并我所有的数据,我不确定为什么,即立方体的“地板”有“气泡”,但大部分“屋顶”什么都没有:

当您查看绘制的原始星域时,这显然是错误的:

看起来 z 值较高的 bin 没有保存任何数据。这可能是一个非常简单的问题,但我需要一些比我更擅长 python 的新鲜的眼睛和头脑。

谁能想到这是如何解决的?另外我想找到一种方法来计算每个盒子的点数,即每个箱子。

对不起,如果我有点昏昏欲睡,但我很感激你们任何优秀的人可以提供给我的任何帮助。

谢谢朋友!

【问题讨论】:

  • 您链接的答案中的代码对我来说看起来过于复杂,也许我只是不明白他们想要做什么。要计算任何维度的直方图,只需使用numpy.histogramdd
  • 您可以在您的示例上运行 KDE 并通过体渲染将其可视化。例如,请参阅here
  • KDE 处理看起来非常好,谢谢 Vlas。我唯一要做的就是计算每个垃圾箱的点数。对为什么 scipy.stats.binned_statistic_dd 会出现以下错误感到困惑:TypeError: binned_statistic_dd() 需要至少 2 个参数(给定 5 个)
  • @Skippeh 很难判断我们看不到的代码有什么问题。正如我已经说过的,您可以使用 numpy.histogramdd 计算每个 bin 的点数。

标签: python matplotlib statistics astronomy


【解决方案1】:

在 cmets 中,您有一些替代方案可以解决您的问题,并且很难在没有看到代码的情况下说出您的代码有什么问题。在任何情况下,这类问题通常可以通过计算规则网格内的数据来解决(尽管如此,这是制作直方图的一般方法)。

构建自己的网格的优势在于,您可以立即知道每个“扇区”的位置、起点和终点。因此,如果您想尝试以下方法,我建议您使用以下方法。

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()

随机数据的结果是这样的:

【讨论】:

    猜你喜欢
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    相关资源
    最近更新 更多