В чем разница между функциями Numpy array() и asarray()? Когда вы должны использовать один, а не другой? Кажется, они генерируют идентичный вывод для всех входов, о которых я могу думать.
Numpy - массив против 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
Разницу можно продемонстрировать на этом примере:
-
генерировать матрицу
>>> A = numpy.matrix(numpy.ones((3,3))) >>> A matrix([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]]) -
используйте
numpy.arrayдля измененияAНе работает, потому что вы изменяете копию>>> numpy.array(A)[2]=2 >>> A matrix([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]]) -
используйте
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) остается нетронутым, и все же мы можем выполнять любую операцию над данными с использованием другого объекта без изменения содержимого в исходном массиве.