В чем разница между функциями array () и asarray () Numpy?

298

В чем разница между Numpy array()и asarray()функциями? Когда вы должны использовать один, а не другой? Кажется, они генерируют идентичный вывод для всех входов, которые я могу придумать.

Бенджамин Ходжсон
источник

Ответы:

110

Поскольку на этот вопрос перенаправляются другие вопросы, в которых задаются вопросы asanyarrayили другие процедуры создания массива , вероятно, стоит иметь краткое описание того, что делает каждый из них.

Различия главным образом заключаются в том, когда возвращать ввод без изменений, а не в создании нового массива в качестве копии.

arrayпредлагает широкий спектр опций (большинство других функций - тонкие обертки вокруг него), включая флаги для определения, когда копировать. Полное объяснение займет столько же времени, сколько и документы (см. Создание массива , но вкратце, вот несколько примеров:

Предположим , aэто ndarrayи mесть matrix, и они оба имеют dtypeиз float32:

  • np.array(a)и np.array(m)скопирует оба, потому что это поведение по умолчанию.
  • np.array(a, copy=False)и np.array(m, copy=False)будет копировать, mно не a, потому что mне является ndarray.
  • np.array(a, copy=False, subok=True)и не np.array(m, copy=False, subok=True)будет копировать ни один, потому что mэто matrix, который является подклассом ndarray.
  • np.array(a, dtype=int, copy=False, subok=True)скопирует оба, потому что dtypeне совместим.

Большинство других функций являются тонкими обертками вокруг arrayэтого элемента управления, когда происходит копирование:

  • asarray: Вход будет возвращен не скопированным, если он совместим ndarray( copy=False).
  • asanyarray: Входные данные будут возвращены не скопированными, если они совместимы ndarrayили подкласс типа matrix( copy=False, subok=True).
  • ascontiguousarray: Ввод будет возвращен не скопированным, если он совместим ndarrayв непрерывном C-порядке ( copy=False, order='C').
  • asfortranarray: Ввод будет возвращен не скопированным, если он совместим ndarrayв непрерывном порядке Фортрана ( copy=False, order='F').
  • require: Входные данные будут возвращены не скопированными, если они совместимы с указанной строкой требований.
  • copy: Ввод всегда копируется.
  • fromiter: Входные данные обрабатываются как итеративные (например, вы можете создать массив из элементов итератора вместо objectмассива с итератором); всегда копируется.

Существуют также вспомогательные функции, такие как asarray_chkfinite(те же правила копирования, что и asarray, но повышаются, ValueErrorесли они есть, nanили infзначения), и конструкторы для подклассов, таких как matrixили для особых случаев, таких как массивы записей, и, конечно, фактический ndarrayконструктор (который позволяет создавать массив напрямую. из шагов по буферу).

abarnert
источник
Спасибо за это, это очень полезно
Крис
234

Определениеasarray является следующим :

def asarray(a, dtype=None, order=None):
    return array(a, dtype, copy=False, order=order)

Так оно и есть array, за исключением того, что у него меньше вариантов, и copy=False. arrayимеет copy=Trueпо умолчанию.

Основным отличием является то, что array(по умолчанию) будет делать копию объекта, а asarrayне будет без необходимости.

unutbu
источник
13
Так, когда мы должны использовать каждый? Если создать массив с нуля, что лучше, array([1, 2, 3])или asarray([1, 2, 3])?
эндолит
15
@endolith: [1, 2, 3]список Python, поэтому необходимо создать копию данных для создания ndarary. Так что используйте np.arrayнапрямую вместо того, np.asarrayчтобы отправить copy=Falseпараметр в np.array. Символ copy=Falseигнорируется, если копия должна быть сделана, как в этом случае. Если вы сравните эти два значения %timeitв IPython, вы увидите разницу для небольших списков, но вряд ли имеет значение, что вы используете для больших списков.
unutbu
3
Это имеет смысл и для имен методов: «asarray»: трактуйте это как массив (на месте), т. Е. Вы просто меняете свое представление об этом списке / массиве. «массив»: на самом деле преобразовать это в новый массив.
Денвар
1
как насчет np.asanyarray?
Ли
3
@Lee: asarrayвсегда возвращает ndarray. asanyarrayвернет подкласс, ndarrayесли это было передано ему. Например, np.matrixявляется подклассом ndarray. Так что np.asanyarray(np.matrix(...))возвращает ту же матрицу, тогда как np.asarray(np.matrix(...))преобразует матрицу в ndarray.
unutbu
114

Разницу можно продемонстрировать на этом примере:

  1. генерировать матрицу

    >>> A = numpy.matrix(numpy.ones((3,3)))
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  2. использовать numpy.arrayдля изменения A. Не работает, потому что вы изменяете копию

    >>> numpy.array(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  3. использовать numpy.asarrayдля изменения A. Это сработало, потому что вы модифицируете Aсебя

    >>> numpy.asarray(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 2.,  2.,  2.]])

Надеюсь это поможет!

Бобби Ву
источник
13

Различия упомянуты достаточно четко в документации arrayи asarray. Различия заключаются в списке аргументов и, следовательно, в зависимости от этих параметров.

Определения функций:

numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)

и

numpy.asarray(a, dtype=None, order=None)

Следующие аргументы - это аргументы, которые могут быть переданы, arrayа не asarray как указано в документации:

copy: bool, необязательный Если true (по умолчанию), то объект копируется . В противном случае копия будет сделана только в том случае, если она будет __array__возвращена, если obj является вложенной последовательностью или если копия требуется для удовлетворения любых других требований (dtype, order и т. Д.).

subok: bool, необязательный Если True, то подклассы будут переданы , в противном случае возвращаемый массив будет вынужден быть массивом базового класса (по умолчанию).

ndmin: int, необязательный параметр Указывает минимальное количество измерений, которое должен иметь результирующий массив . Каждый будет предварительно привязан к форме, необходимой для удовлетворения этого требования.

asheeshr
источник
1

Вот простой пример, который может продемонстрировать разницу.

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

import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)

Содержимое в массиве (a) остается без изменений, и тем не менее мы можем выполнить любую операцию с данными, используя другой объект, не изменяя содержимое в исходном массиве.

Вивек
источник
0

asarray(x) как array(x, copy=False)

Используйте, asarray(x)если вы хотите убедиться, что xэто будет массив до того, как будут выполнены любые другие операции. Если xэто уже массив, то копия не будет сделана. Это не приведет к избыточному снижению производительности.

Вот пример функции, которая гарантирует, что xсначала преобразуется в массив.

def mysum(x):
    return np.asarray(x).sum()
off99555
источник