Получение атрибутов из массивов объектов в NumPy - PullRequest
6 голосов
/ 20 марта 2012

Допустим, у меня есть класс с именем Star, который имеет атрибут color.Я могу получить цвет с помощью star.color.

Но что, если у меня есть массив NumPy этих Star объектов.Каков предпочтительный способ получить массив цветов?

Я могу сделать это с помощью

colors = np.array([s.color for s in stars])

Но разве это лучший способ сделать это?Было бы здорово, если бы я мог просто сделать colors = star.color или colors = star->color и т. Д., Как на некоторых других языках.Есть ли простой способ сделать это в NumPy?

Ответы [ 2 ]

7 голосов
/ 20 марта 2012

Самое близкое к тому, что вы хотите, это использовать recarray вместо ndarray объектов Python:

num_stars = 10
dtype = numpy.dtype([('x', float), ('y', float), ('colour', float)])
a = numpy.recarray(num_stars, dtype=dtype)
a.colour = numpy.arange(num_stars)
print a.colour

печать

[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9.]

Использование массива объектов Python NumPy обычно менее эффективно, чем использование простого list, тогда как recarray хранит данные в более эффективном формате.

3 голосов
/ 20 марта 2012

Вы можете использовать numpy.fromiter(s.color for s in stars) (обратите внимание на отсутствие квадратных скобок).Это позволит избежать создания промежуточного списка, который, я полагаю, вас может заинтересовать, если вы используете numpy.

(Спасибо @SvenMarnach и @DSM за их исправления ниже).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...