Numpy - массив против asarray

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

Ответ 1

Поскольку на этот вопрос перенаправляются другие вопросы, которые 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_chkfinite (те же правила копирования, что и asarray, но вызывает ValueError если есть какие-либо значения nan или inf), и конструкторы для подклассов, таких как matrix или для особых случаев, таких как массивы записей, и, конечно, фактический конструктор ndarray ( который позволяет вам создать массив прямо из буфера).

Ответ 2

Определение asarray:

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

Итак, это похоже на array, но у него меньше вариантов и copy=False. array по умолчанию имеет copy=True.

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

Ответ 3

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

  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.]])
    

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

Ответ 4

Различия упоминаются достаточно четко в документации 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, optional Если true (по умолчанию), то объект копируется. В противном случае копия будет сделана только в том случае, если __array__ возвращает копию, если obj - вложенная последовательность, или если требуется копия для удовлетворения любой из другие требования (dtype, order и т.д.).

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

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

Ответ 5

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

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

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

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