Ответы:
Поскольку на этот вопрос перенаправляются другие вопросы, в которых задаются вопросы 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
конструктор (который позволяет создавать массив напрямую. из шагов по буферу).
Определениеasarray
является следующим :
def asarray(a, dtype=None, order=None):
return array(a, dtype, copy=False, order=order)
Так оно и есть array
, за исключением того, что у него меньше вариантов, и copy=False
. array
имеет copy=True
по умолчанию.
Основным отличием является то, что array
(по умолчанию) будет делать копию объекта, а asarray
не будет без необходимости.
array([1, 2, 3])
или asarray([1, 2, 3])
?
[1, 2, 3]
список Python, поэтому необходимо создать копию данных для создания ndarary
. Так что используйте np.array
напрямую вместо того, np.asarray
чтобы отправить copy=False
параметр в np.array
. Символ copy=False
игнорируется, если копия должна быть сделана, как в этом случае. Если вы сравните эти два значения %timeit
в IPython, вы увидите разницу для небольших списков, но вряд ли имеет значение, что вы используете для больших списков.
np.asanyarray
?
asarray
всегда возвращает ndarray
. asanyarray
вернет подкласс, ndarray
если это было передано ему. Например, np.matrix
является подклассом ndarray
. Так что np.asanyarray(np.matrix(...))
возвращает ту же матрицу, тогда как np.asarray(np.matrix(...))
преобразует матрицу в ndarray
.
Разницу можно продемонстрировать на этом примере:
генерировать матрицу
>>> 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.]])
Надеюсь это поможет!
Различия упомянуты достаточно четко в документации 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, необязательный параметр Указывает минимальное количество измерений, которое должен иметь результирующий массив . Каждый будет предварительно привязан к форме, необходимой для удовлетворения этого требования.
Вот простой пример, который может продемонстрировать разницу.
Основное отличие состоит в том, что массив будет копировать исходные данные и, используя другой объект, мы можем изменить данные в исходном массиве.
import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)
Содержимое в массиве (a) остается без изменений, и тем не менее мы можем выполнить любую операцию с данными, используя другой объект, не изменяя содержимое в исходном массиве.
asarray(x)
как array(x, copy=False)
Используйте, asarray(x)
если вы хотите убедиться, что x
это будет массив до того, как будут выполнены любые другие операции. Если x
это уже массив, то копия не будет сделана. Это не приведет к избыточному снижению производительности.
Вот пример функции, которая гарантирует, что x
сначала преобразуется в массив.
def mysum(x):
return np.asarray(x).sum()