Numpy: Enh: Функция создания массива объектов

Созданный на 2 июн. 2015  ·  4Комментарии  ·  Источник: numpy/numpy

Как обсуждалось в выпуске № 5303, в настоящее время невозможно создавать массивы объектов dtype, содержащие последовательности одинаковой длины, поскольку последовательность автоматически считывается как элементы массива. Есть предложение делать это только для списков, но это будет серьезным нарушением обратной совместимости и потребует длительного периода устаревания.

Другой подход состоял бы в том, чтобы явно иметь функцию для создания массивов с объектом dtype. Возможно, это можно было бы назвать «objectarray». По умолчанию эта функция принимает последовательность и рассматривает каждый элемент последовательности как элемент в массиве одномерных объектов.

Однако функция может иметь необязательный аргумент «ndim» или «depth», который можно использовать для указания того, сколько уровней последовательности следует считать частью массива. По умолчанию это значение равно 0 (учитывается только самый внешний уровень). Это вызовет исключение, если размеры не совпадают.

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

Так, например:

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))])
>>> arr
array([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], dtype=object)
>>> arr.shape
(2,)

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], depth=1)
>>> arr
array([[(1, 2, 3), (4, 5, 6)],
       [(7, 8, 9), (10, 11, 12)]], dtype=object)
>>> arr.shape
(2, 2)

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], depth=2)
>>> arr
array([[[1, 2, 3],
        [4, 5, 6]],

       [[7, 8, 9],
        [10, 11, 12]]], dtype=object)
>>> arr.shape
(2, 2, 3)

Самый полезный комментарий

Надеюсь, я ничего не упустил, но мне кажется, что аргумент ndmax не только решил бы проблему, о которой сообщают («_создавать массивы объектов dtype, содержащие последовательности одинаковой длины_»), но и дал бы прирост производительности в те случаи, когда, например, последний объект на входе не является списком (или представляет собой список другой длины). Также см. этот вопрос .

Все 4 Комментарий

Я думаю, что самый простой способ получить списки одинакового размера в массиве объектов состоит из двух шагов:

>>> a = empty((2,), dtype=np.object)
>>> a[:] = [[1,2,3],[4,5,6]]

>>> b = empty((2,3), dtype=np.object)
>>> b[:] = [[1,2,3],[4,5,6]]

Вероятно, реализация objectarray будет работать так.

Да, в настоящее время это лучший способ, но он излишне многословен. Отсюда эта идея.

Хотелось бы надеяться, что реализация этой идеи сможет просто обойти автоматическое преобразование, используемое в функции array , и заменить конструктор ndarray своим собственным.

Надеюсь, я ничего не упустил, но мне кажется, что аргумент ndmax не только решил бы проблему, о которой сообщают («_создавать массивы объектов dtype, содержащие последовательности одинаковой длины_»), но и дал бы прирост производительности в те случаи, когда, например, последний объект на входе не является списком (или представляет собой список другой длины). Также см. этот вопрос .

Есть ли прогресс или планы по внедрению ndmax ? Что я делаю прямо сейчас:

np.array([*data, None])[:-1]

# This would look a lot cleaner:
np.array(data, ndmax=1)
Была ли эта страница полезной?
0 / 5 - 0 рейтинги