Как создать простой массив объектов без предварительного создания списка? - PullRequest
1 голос
/ 29 сентября 2019
arr = np.array([Myclass(np.random.random(100)) for _ in range(10000)])

Есть ли способ сэкономить время в этом утверждении путем непосредственного создания массива объектов (исключая создание списка, которое является дорогостоящим)?

Мне нужно создать и обработать большое количество объектов класса Myclass, где каждый объект содержит несколько чисел типа int, несколько чисел с плавающей точкой и список (или кортеж) чисел с плавающей точкой.Смысл использования массива (объектов) состоит в том, чтобы воспользоваться преимуществами быстрого вычисления массива (например, суммы столбцов) на срезах массива объектов (и других вещей; массив, на котором взяты срезы, состоит из каждой строки, составленнойодного объекта Myclass и других скалярных полей).Кроме использования np.array (как указано выше), есть ли другая стратегия экономии времени в этом случае?Спасибо.

1 Ответ

2 голосов
/ 29 сентября 2019

Numpy необходимо заранее знать длину массива, поскольку он должен выделить достаточно памяти в блоке.

Вы можете начать с пустого массива соответствующего типа, используя np.empty(10_000, object).(Помните, что для большинства типов данных пустые массивы могут содержать мусорные данные, обычно безопаснее начинать с np.zeros(), если только вам не нужна производительность, но объект dtype правильно инициализируется None с.)

Затем вы можете применить любой вызываемый элемент (например, класс) ко всем значениям, используя np.vectorize.По возможности быстрее использовать включенные векторизованные функции вместо их преобразования, поскольку vectorize в основном должен вызывать его для каждого элемента в цикле for.Но иногда вы не можете.

В случае случайных чисел, вы можете создать образец массива любой фигуры, используя np.random.rand().Тем не менее, он все равно должен быть преобразован в новый массив объекта dtype, когда вы примените к нему свой класс.Я не уверен, что это быстрее, чем создавать сэмплы в каждом __init__ (или в любом другом вызываемом).Вы должны профилировать его.

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