#python #numpy
#python #numpy
Вопрос:
Я начал изучать python и numpy, я хотел создать массив объектов класса. Я проверил Google, но, похоже, не могу найти ни одной статьи об этом (по крайней мере, не это легко понять на моем уровне)
Это часть моего кода, который я пытаюсь выполнить, если это поможет
class Point:
def __init(self):
self.x = random()
self.y = random()
def show(self):
.
.
(function code)
.
.
points = np.empty(100, dtype = Point)
for i in range(100):
points[i].show()
трассировка
AttributeError: 'NoneType' object has no attribute 'show'
Аналог c будет
Point = points[100];
for(int i=0;i<100;i ){
points[i].show()
}
Я хочу реализовать это на python, чтобы я мог использовать show(), который я определил в классе
Пожалуйста, укажите мне, если я не предоставил достаточно информации (также новой для stacksoverflow)
заранее спасибо за помощь
Комментарии:
1. Может
points = [Point() for _ in range(100]
быть, поможет2. Для начинающего программиста на Python / numpy это не очень хорошее начало. Одно дело определить класс и поместить несколько экземпляров в список. Но не пытайтесь создать из них массив. Это мало что добавляет ни с точки зрения выразительности, ни производительности. Сначала научитесь хорошо использовать числовой
numpy
код.3. @hpaulj вы знаете, поддерживаются ли операции SIMD для массивов объектов? Я никогда не видел, чтобы это где-нибудь делалось
4. @anon01, как и a
list
, массивobject
dtype содержит ссылки (указатели) на объекты, хранящиеся в другом месте в памяти. Чтобы получить доступ к атрибуту или запустить метод, вы должны получить ссылку на этот объект — это чистая операция Python. Итерация по массиву объектов dtype немного медленнее, чем итерация по списку.5. Вы пробовали проверять значение
points
?
Ответ №1:
Когда вы делаете
points = np.empty(100, dtype = Point)
Это просто говорит о том, что тип данных вещей внутри points
есть Point
. Он не points
заполняется объектами. Вам нужно явно поместить в него объекты. Одним из способов было бы
points[0] = Point()
И так далее.
Комментарии:
1. На самом деле это
dtype=object
. Элементы являются ссылками на любой объект python. Здесь, для безопасности, все они установлены наNone
.2. Спасибо за исправление. Это было удивительно. Мне нужно понять, почему это
dtype=object
так, а неdtype=Point
3. Если
dtype
это не встроенный скалярный (np.int64
,U3
etc) или составной (структурированный массив), то это такobject
. Как и в случае с alist
, такой массив содержит ссылки на объекты python, которые могут быть любыми —None
,list
, число, массив, пользовательский класс и т.д.