1

我已经在这里就同一主题提出了一些问题,但我真的很努力不让我正在研究的教授失望。这是我第一次使用 Python,我可能有点过头了。

无论如何,我收到了一个要读取的文件,并且能够使用以下命令:

SNdata = numpy.genfromtxt('...', dtype=None, 
usecols (0,6,7,8,9,19,24,29,31,33,34,37,39,40,41,42,43,44), 
names ['sn','off1','dir1','off2','dir2','type','gal','dist',
'htype','d1','d2','pa','ai','b','berr','b0','k','kerr'])

sn只是特定超新星名称的数组;type是一组超新星类型(Ia 或 II)等。

我需要做的第一件事就是简单地计算给定 SN 类型(Ia 或 II)的某些属性的概率。

例如,该列htype是星系的形态(以整数 1=椭圆形到 8=不规则形)。我需要计算给定 TypeIa 的椭圆和给定 TypeII 的椭圆的概率,所有整数最多为 8。

对于椭圆,我知道我只需要元素的数量htype = 1 and type = Ia除以元素的总数type = Ia。然后是元素的数量htype = 1 and type = II除以元素的总数type = II

我只是不知道如何为此编写代码。我计划先找到每种类型的总数,然后运行一个 for 循环来查找具有特定htype给定type(Ia 或 II)的元素的数量。

有人可以帮我开始吗?如果需要任何澄清,请告诉我。

非常感谢。

4

2 回答 2

4

Numpy 支持布尔数组操作,这将使您的代码编写起来相当简单。例如,您可以这样做:

htype_sums = {}
for htype_number in xrange(1,9):
  htype_mask = SNdata.htype == htype_number
  Ia_mask = SNdata.type == 'Ia'
  II_mask = SNdata.type == 'II'

  Ia_sum = (htype_mask & Ia_mask).sum() / Ia_mask.sum()
  II_sum = (htype_mask & II_mask).sum() / II_mask.sum()
  htype_sums[htype_number] = (Ia_sum, II_sum)

每个_mask变量都是布尔数组,所以当你对它们求和时,你会计算True.

于 2013-11-03T23:04:52.033 回答
1

您可以使用collections.Counter来计算所需的观察结果。

例如,

from collections import Counter
types_counter = Counter(row['type'] for row in data)

将为您提供所需的 sn 计数types

htypes_types_counter = Counter((row['type'], row['htype']) for row in data) 

计算形态和类型。然后,要获得对椭圆机的评估,只需除以

1.0*htypes_types_counter['Ia', 1]/types_counter['Ia']
于 2013-11-03T23:03:35.933 回答