В чем разница между функциями 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) остается нетронутым, и все же мы можем выполнять любую операцию над данными с использованием другого объекта без изменения содержимого в исходном массиве.