Что такое измерение и ось в Python NumPy?

82

Я кодирую NumPyмодуль Pythons . Если координаты точки в трехмерном пространстве описываются как [1, 2, 1], не будет ли это три измерения, три оси, ранг три? Или, если это одно измерение, разве это не должны быть точки (во множественном числе), а не точки?

Вот документация:

В Numpy измерения называются осями. Количество осей ранговое. Например, координаты точки в трехмерном пространстве [1, 2, 1] представляют собой массив ранга 1, потому что он имеет одну ось. Эта ось имеет длину 3.

Источник: http://wiki.scipy.org/Tentative_NumPy_Tutorial

Давиджхп
источник

Ответы:

97

В numpy arrays размерность относится к количеству элементов, axesнеобходимых для его индексации, а не к размерности любого геометрического пространства. Например, вы можете описать расположение точек в трехмерном пространстве с помощью двухмерного массива:

array([[0, 0, 0],
       [1, 2, 3],
       [2, 2, 2],
       [9, 9, 9]])

Который имеет shapeобъем (4, 3)и размер 2. Но он может описывать трехмерное пространство, потому что длина каждой строки ( axis1) равна трем, поэтому каждая строка может быть компонентом x, y и z местоположения точки. Длина axis0 указывает количество точек (здесь 4). Однако это скорее приложение к математике, которую описывает код, а не атрибут самого массива. В математике размерностью вектора будет его длина (например, компоненты x, y и z трехмерного вектора), но в numpy любой «вектор» на самом деле просто считается 1d-массивом переменной длины. Массиву безразлично, каков размер описываемого пространства (если есть).

Вы можете поиграть с этим и увидеть количество размеров и форму массива следующим образом:

In [262]: a = np.arange(9)

In [263]: a
Out[263]: array([0, 1, 2, 3, 4, 5, 6, 7, 8])

In [264]: a.ndim    # number of dimensions
Out[264]: 1

In [265]: a.shape
Out[265]: (9,)

In [266]: b = np.array([[0,0,0],[1,2,3],[2,2,2],[9,9,9]])

In [267]: b
Out[267]: 
array([[0, 0, 0],
       [1, 2, 3],
       [2, 2, 2],
       [9, 9, 9]])

In [268]: b.ndim
Out[268]: 2

In [269]: b.shape
Out[269]: (4, 3)

Массивы могут иметь много измерений, но их становится трудно визуализировать выше двух или трех:

In [276]: c = np.random.rand(2,2,3,4)

In [277]: c
Out[277]: 
array([[[[ 0.33018579,  0.98074944,  0.25744133,  0.62154557],
         [ 0.70959511,  0.01784769,  0.01955593,  0.30062579],
         [ 0.83634557,  0.94636324,  0.88823617,  0.8997527 ]],

        [[ 0.4020885 ,  0.94229555,  0.309992  ,  0.7237458 ],
         [ 0.45036185,  0.51943908,  0.23432001,  0.05226692],
         [ 0.03170345,  0.91317231,  0.11720796,  0.31895275]]],


       [[[ 0.47801989,  0.02922993,  0.12118226,  0.94488471],
         [ 0.65439109,  0.77199972,  0.67024853,  0.27761443],
         [ 0.31602327,  0.42678546,  0.98878701,  0.46164756]],

        [[ 0.31585844,  0.80167337,  0.17401188,  0.61161196],
         [ 0.74908902,  0.45300247,  0.68023488,  0.79672751],
         [ 0.23597218,  0.78416727,  0.56036792,  0.55973686]]]])

In [278]: c.ndim
Out[278]: 4

In [279]: c.shape
Out[279]: (2, 2, 3, 4)
косо
источник
9

Он первого ранга, так как вам нужен один индекс для его индексации. Это одна ось имеет длину 3, в качестве индекса индексации он может принимать три различных значения: v[i], i=0..2.

Балинт Аради
источник
8

Просто вставьте часть ответа из этого ответа :

В Numpy размер , ось / оси , форма связаны между собой, а иногда и схожими понятиями:

In [1]: import numpy as np

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

измерение

В математике / физике размерность или размерность неофициально определяется как минимальное количество координат, необходимых для определения любой точки в пространстве. Но в Numpy , согласно документу numpy , это то же самое, что ось / оси:

В Numpy измерения называются осями. Количество осей ранговое.

In [3]: a.ndim  # num of dimensions/axes, *Mathematics definition of dimension*
Out[3]: 2

ось / оси

энный координат индексировать arrayв Numpy. А многомерные массивы могут иметь по одному индексу для каждой оси.

In [4]: a[1,0]  # to index `a`, we specific 1 at the first axis and 0 at the second axis.
Out[4]: 3  # which results in 3 (locate at the row 1 and column 0, 0-based index)

форма

описывает, сколько данных по каждой доступной оси.

In [5]: a.shape
Out[5]: (2, 2)  # both the first and second axis have 2 (columns/rows/pages/blocks/...) data
YaOzI
источник
5

Вы также можете использовать параметр оси в групповых операциях, в случае оси = 0 Numpy выполняет действие с элементами каждого столбца, а если ось = 1, он выполняет действие со строками.

test = np.arange(0,9).reshape(3,3)

Out[3]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

test.sum(axis=0)
Out[5]: array([ 9, 12, 15])

test.sum(axis=1)
Out[6]: array([ 3, 12, 21])
Алексей Грановский
источник
4

Я так понимаю. Точка - это одномерный объект. Вы можете только определить его положение. У него нет размеров. Линия или поверхность - это 2D-объект. Вы можете определить его как по положению, так и по длине или площади соответственно, например, прямоугольник, квадрат, круг Объем - это трехмерный объект. Вы можете определить его по положению, площади / длине поверхности и объему, например, Сфера, Куб.

Исходя из этого, вы определите точку в NumPy по одной оси (измерению), независимо от количества используемых вами математических осей. Для осей x и y точка определяется как [2,4], а для осей x, y и z точка определяется как [2,4,6]. Оба они являются точками, поэтому 1D.

Для определения линии потребуются две точки. Это потребует некоторой формы «вложения» точек во второе измерение (2D). Таким образом, линия может быть определена с использованием x и y только как [[2,4], [6,9]] или с использованием x, y и z как [[2,4,6], [6,9,12 ]]. Для поверхности просто потребуется больше точек для ее описания, но она все равно останется 2D-объектом. Например, для треугольника потребуется 3 точки, а для прямоугольника / квадрата - 4.

Для определения объема потребуется 4 (тетраэдр) или более точек, но при этом сохраняется «вложенность» точек в третье измерение (3D).

Людекс
источник