Если я понимаю ваше описание, у вас есть набор данных примерно такой:
In [79]: x=np.random.randint(0,3,size=100)
In [80]: y=np.random.randint(0,100,size=100)
In [81]: d=np.vstack([x,y]).T
In [88]: print d[:5,:]
[[ 0 43]
[ 1 60]
[ 2 60]
[ 1 4]
[ 0 30]]
В этой ситуации numpy.unique
может использоваться для генерации массива уникальных «ключевых» значений:
In [82]: idx=np.unique(d[:,0])
In [83]: print idx
[0 1 2]
и те значения, которые используются для управления выражением генератора следующим образом:
[113]: g=(d[np.where(d[:,0]==val),1].std() for val in idx)
Генератор g
выдаст стандартное отклонение всех записей в d
, которые соответствуют каждой записи в индексе. numpy.fromiterator
затем можно использовать для сбора результатов:
In [114]: print np.vstack([idx,np.fromiter(g,dtype=np.float)]).T
[[ 0. 26.87376385]
[ 1. 29.41046084]
[ 2. 24.2477246 ]]
Обратите внимание, что на последнем шаге во время суммирования происходит преобразование ключей в число с плавающей запятой. Возможно, вы этого не захотите, в зависимости от ваших данных, но я сделал это только для наглядности, чтобы получить «красивый» конечный результат для публикации.