Составить массив / матрицу на основе значений столбцов и переменных? - PullRequest
1 голос
/ 31 августа 2011

Я играю с NumPy и Scipy, и у меня возникают проблемы с поиском функции в документации. Мне было интересно, может ли кто-нибудь помочь.

Предположим, у меня есть массив в NumPy с двумя столбцами и k строками. Один столбец служит числовым индикатором (например, 2 = male, 1 = female, 0 = unknown), тогда как второй столбец, возможно, представляет собой list значений или баллов.

Допустим, я хочу найти стандартное отклонение (может быть средним или любым другим, я просто хочу применить функцию) значений для всех строк с индикатором 0, а затем для 1 и, наконец, 2.

Есть ли предопределенная функция для составления этого для меня?

В R эквивалент можно найти в пакете plyr. Имеет ли NumPy и / или Scipy эквивалент, или я застрял, создавая маску для этого массива, а затем каким-то образом фильтруя эту маску и затем применяя мою функцию?

Как всегда, спасибо за помощь!

Ответы [ 2 ]

4 голосов
/ 31 августа 2011

Если я понимаю ваше описание, у вас есть набор данных примерно такой:

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 ]]

Обратите внимание, что на последнем шаге во время суммирования происходит преобразование ключей в число с плавающей запятой. Возможно, вы этого не захотите, в зависимости от ваших данных, но я сделал это только для наглядности, чтобы получить «красивый» конечный результат для публикации.

2 голосов
/ 31 августа 2011

Для этого вы можете использовать маскированные операции с массивами.http://docs.scipy.org/doc/numpy/reference/maskedarray.html#maskedarray

Чтобы создать маску, вы можете использовать функцию numpy.where, например:

male_mask = numpy.where(a[:,0]==2, False, True)
female_mask = numpy.where(a[:,0]==1, False, True)

Затем не забудьте использовать специальные функции из numpy.ma: http://docs.scipy.org/doc/numpy/reference/routines.ma.html

male_average = numpy.ma.average(ma.array(a[:,1], mask=male_mask))

РЕДАКТИРОВАТЬ: на самом деле, это работает так же хорошо:

numpy.ma.average(ma.array(a[:,1], mask=a[:,0]!=value))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...