Яка різниця між ndarray та масивом у numpy?


Відповіді:


220

numpy.array- це лише зручність функції для створення ndarray; це не сам клас.

Ви також можете створити масив за допомогою numpy.ndarray, але це не рекомендований спосіб. З докстрингу numpy.ndarray:

Масиви повинні бути побудовані з використанням array, zerosабо empty... Параметри, наведені тут, відносяться до методу низького рівня ( ndarray(...)) для ідентифікації масиву.

Більша частина м'яса реалізації знаходиться в коді С, тут - у багатомагнітному масиві , але ви можете почати дивитися на інтерфейси ndarray тут:

https://github.com/numpy/numpy/blob/master/numpy/core/numeric.py


1
Я думаю, що масив () реалізований в core / src / multiarray / method.c в array_getarray ().
flxb

6
Це може вкусити вас, якщо ви забудете, що np.arrayце не клас, як я часто це роблю. x = np.array([1,2.1,3]) if isinstance(x,np.array): # will give you a TypeError
Стів Л

4
Все ще не маєте поняття, чому слід уникати використання ndarray? Тому що це низький рівень?
ГабріельЧу

@flxb: Ні, array_getarrayце реалізація numpy.ndarray.__array__. numpy.arrayпочинається з _array_fromobject, принаймні, в поточній реалізації.
user2357112 підтримує Моніку

2
То чому це не рекомендується?
NoName


31

Всього кілька рядків прикладу коду, щоб показати різницю між numpy.array та numpy.ndarray

Крок розминки: побудова списку

a = [1,2,3]

Перевірте тип

print(type(a))

Ти отримаєш

<class 'list'>

Побудуйте масив (зі списку) за допомогою np.array

a = np.array(a)

Або, ви можете пропустити крок розминки, безпосередньо мати

a = np.array([1,2,3])

Перевірте тип

print(type(a))

Ти отримаєш

<class 'numpy.ndarray'>

який повідомляє вам тип масиву numpy - numpy.ndarray

Ви також можете перевірити тип

isinstance(a, (np.ndarray))

і ви отримаєте

True

Будь-який із наступних двох рядків надішле вам повідомлення про помилку

np.ndarray(a)                # should be np.array(a)
isinstance(a, (np.array))    # should be isinstance(a, (np.ndarray))

4

numpy.ndarray()є класом, в той час numpy.array()як метод / функція для створення ndarray.

У numpy docs, якщо ви хочете створити масив з ndarrayкласу, ви можете це зробити двома способами, як цитується:

1 використовуючи array(), zeros()або empty()методи: Масиви повинні бути побудовані з використанням масиву, нулі або порожні (див також розділ нижче). Параметри, наведені тут, відносяться до методу низького рівня ( ndarray(…)) для ідентифікації масиву.

2- з ndarrayкласу безпосередньо: Є два режими створення масиву за допомогою __new__: Якщо буфера немає, тоді використовуються лише форма, тип і порядок. Якщо буфер є об'єктом, що відкриває буферний інтерфейс, то всі ключові слова інтерпретуються.

Наведений нижче приклад дає випадковий масив, оскільки ми не призначили значення буфера:

np.ndarray(shape=(2,2), dtype=float, order='F', buffer=None)

array([[ -1.13698227e+002,   4.25087011e-303],
       [  2.88528414e-306,   3.27025015e-309]])         #random

Інший приклад - присвоєння об’єкту масиву прикладу буфера:

>>> np.ndarray((2,), buffer=np.array([1,2,3]),
...            offset=np.int_().itemsize,
...            dtype=int) # offset = 1*itemsize, i.e. skip first element
array([2, 3])

З наведеного вище прикладу ми помічаємо, що ми не можемо призначити список "буфері", і нам довелося використовувати numpy.array () для повернення об'єкта ndarray для буфера

Висновок: використовуйте, numpy.array()якщо ви хочете зробити numpy.ndarray()об’єкт "


0

Я думаю, що з np.array()вами ви можете створити лише C на зразок, хоча ви згадуєте про порядок, коли ви перевіряєте, чи використовуєте np.isfortran()його, пише false. але np.ndarrray()коли ви вказуєте порядок, він створюється на основі наданого замовлення.

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