Відповіді:
Оскільки інші питання переспрямовуються на цей, який запитує про 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()