Відповіді:
Оскільки інші питання переспрямовуються на цей, який запитує про 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
конструктор (який дозволяє створювати масив безпосередньо з ходу по буфері).
Визначення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
якщо саме це було передано йому. Наприклад, an np.matrix
є підкласом ndarray
. Отже np.asanyarray(np.matrix(...))
повертає ту саму матрицю, тоді як np.asarray(np.matrix(...))
перетворює матрицю в an 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
зазначені в документації:
копія: bool, необов'язково Якщо істинно (за замовчуванням), то об'єкт копіюється . В іншому випадку копія буде зроблена лише тоді, коли
__array__
поверне копію, якщо obj є вкладеною послідовністю або якщо копія потрібна для задоволення будь-яких інших вимог (dtype, замовлення тощо).subok: bool, необов'язково If 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()