В чем разница между ndarray и array в numpy?


Ответы:


221

numpy.arrayэто просто удобная функция для создания ndarray; это не сам класс.

Вы также можете создать массив с помощью numpy.ndarray, но это не рекомендуемый способ. Из документации numpy.ndarray:

Массивы должны быть созданы с использованием array, zerosили empty... Параметры, приведенные здесь, относятся к низкоуровневому методу ( ndarray(...)) для создания экземпляра массива.

Большая часть реализации реализована в коде на C, здесь - в нескольких массивах , но вы можете посмотреть на интерфейсы ndarray здесь:

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


1
Я думаю, что array () реализован в 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 поддерживает Monica

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.

В numy docs, если вы хотите создать массив из ndarrayкласса, вы можете сделать это двумя способами, как указано:

1- используя array(), zeros()или empty()методы: Массивы должны быть построены с использованием массива, нули или пустые (см также раздел ниже). Параметры, приведенные здесь, относятся к низкоуровневому методу ( ndarray(…)) для создания экземпляра массива.

2 - ndarrayнепосредственно из класса: существует два режима создания массива с использованием __new__: Если для буфера задано None, то используются только shape, dtype и order. Если буфер является объектом, представляющим интерфейс буфера, то все ключевые слова интерпретируются.

Пример ниже дает случайный массив, потому что мы не присваивали значение буфера:

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.