Яка різниця між функціями Numpy array () та asarray ()?


297

Яка різниця між 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у постійному порядку Fortran ( copy=False, order='F').
  • require: Вхід буде повернуто не скопійованим, якщо він сумісний із заданими рядками вимог.
  • copy: Вхід завжди копіюється.
  • fromiter: Вхід трактується як ітерабельний (так, наприклад, ви можете побудувати масив з елементів ітератора, замість objectмасиву з ітератором); завжди копіюється.

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


Дякую за це, це дуже корисно
Kris

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цьому не буде, якщо не буде необхідності.


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": трактуйте це як масив (inplace), тобто ви начебто просто змінюєте свій погляд на цей список / масив. "масив": фактично перетворити це в новий масив.
денвар

1
як щодо np.asanyarray?
Лі

3
@Lee: asarrayзавжди повертає ndarray. asanyarrayповерне підклас, ndarrayякщо саме це було передано йому. Наприклад, an np.matrixє підкласом ndarray. Отже np.asanyarray(np.matrix(...))повертає ту саму матрицю, тоді як np.asarray(np.matrix(...))перетворює матрицю в an ndarray.
unutbu

113

Різниця може бути продемонстрована на цьому прикладі:

  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 зазначені в документації:

копія: bool, необов'язково Якщо істинно (за замовчуванням), то об'єкт копіюється . В іншому випадку копія буде зроблена лише тоді, коли __array__поверне копію, якщо obj є вкладеною послідовністю або якщо копія потрібна для задоволення будь-яких інших вимог (dtype, замовлення тощо).

subok: bool, необов'язково If True, то підкласи будуть передані , інакше повернутий масив буде змушений бути масивом базового класу (за замовчуванням).

ndmin: int, необов'язково Вказує мінімальну кількість розмірів, які повинен мати отриманий масив . Одні будуть заздалегідь підведені до форми, як це потрібно для задоволення цієї вимоги.


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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.