Python noob:操纵数组

时间:2013-11-03 22:54:07

标签: python arrays numpy probability

我已经在这里就这个相同的主题提出了几个问题,但我真的不想让我正在研究的教授失望。这是我第一次使用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(Ia或II)的某个type元素的数量。

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

非常感谢。

2 个答案:

答案 0 :(得分: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的元素数。

答案 1 :(得分: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']