Как создать массив объектов класса в Python (Numpy)

#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 . Как и в случае с a list , такой массив содержит ссылки на объекты python, которые могут быть любыми — None , list , число, массив, пользовательский класс и т.д.