что делает numpy ndarray?

У меня есть простой вопрос о функции.shape, которая меня смутила.

a = np.array([1, 2, 3])   # Create a rank 1 array
print(type(a))            # Prints "<class 'numpy.ndarray'>"
print(a.shape)            # Prints "(3,)"

b = np.array([[1,2,3],[4,5,6]])    # Create a rank 2 array
print(b.shape)                     # Prints "(2, 3)"

Что именно изменилось? подсчитайте количество строк, сколько столбцов, а затем a.shape, (1,3), одну строку три столбца, правильно?

Ответ 1

yourarray.shape или np.shape() или np.ma.shape() возвращает форму вашего ndarray в виде кортежа; И вы можете получить (количество) измерений вашего массива, используя yourarray.ndim или np.ndim(). (то есть он дает n ndarray, поскольку все массивы в NumPy являются просто n-мерными массивами (кратко называемыми ndarray s))

Для одномерного массива форма будет (n,), где n - количество элементов в вашем массиве.

Для двумерного массива форма будет (n,m), где n - это количество строк, а m - это количество столбцов в вашем массиве.

Обратите внимание, что в 1D форме просто будет (n, ) вместо того, что вы сказали как (1, n) или (n, 1) для векторов строк и столбцов соответственно.

Это должно следовать соглашению, что:

Для одномерного массива верните кортеж формы только с 1 элементом (т.е. (n,))
Для двумерного массива верните кортеж формы только с 2 элементами (т.е. (n,m))
Для трехмерного массива верните кортеж формы только с 3 элементами (т.е. (n,m,k))
Для массива 4D верните кортеж формы только с 4 элементами (т.е. (n,m,k,j))

и так далее.

Кроме того, см. пример ниже, чтобы увидеть, как np.shape() или np.ma.shape() ведет себя с массивами 1D и скалярами:

# sample array
In [10]: u = np.arange(10)

# get its shape
In [11]: np.shape(u)    # u.shape
Out[11]: (10,)

# get array dimension using 'np.ndim'
In [12]: np.ndim(u)
Out[12]: 1

In [13]: np.shape(np.mean(u))
Out[13]: ()       # empty tuple (to indicate that a scalar is a 0D array).

# check using 'numpy.ndim'
In [14]: np.ndim(np.mean(u))
Out[14]: 0

П.С.: Итак, кортеж формы соответствует нашему пониманию размеров пространства, по крайней мере, математически.

Ответ 2

В отличие от самого популярного коммерческого конкурента, многозначительно с самого начала стоит о "произвольно-мерных" массивах, поэтому основной класс называется ndarray. Вы можете проверить размерность массива numpy, используя свойство .ndim. Свойством .shape является кортеж длины .ndim содержащий длину каждого измерения. В настоящее время numpy может обрабатывать до 32 измерений:

a = np.ones(32*(1,))
a
# array([[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ 1.]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]])
a.shape
# (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
a.ndim
# 32

Если массив numpy окажется равным 2d, как и ваш второй пример, тогда вам следует подумать об этом в терминах строк и столбцов. Но 1d-массив в numpy действительно 1d, никаких строк или столбцов.

Если вы хотите что-то вроде строки или столбца, вы можете достичь этого, создав массив 2d с одним из его размеров, равным 1.

a = np.array([[1,2,3]]) # a 'row vector'
b = np.array([[1],[2],[3]]) # a 'column vector'
# or if you don't want to type so many brackets:
b = np.array([[1,2,3]]).T

Ответ 3

.shape() дает фактическую форму вашего массива с точки зрения количества элементов в нем, количества строк/количества столбцов. Ответ вы получите в виде кортежей.

Например: 1D ARRAY:

d=np.array([1,2,3,4])
print(d)
d

Вывод: (4,) то есть число 4 обозначает количество элементов в массиве 1D.

2D Array:

e=np.array([[1,2,3],[4,5,6]])   
e

Вывод: (2,3) то есть количество строк и количество столбцов.

Количество элементов в окончательном выводе будет зависеть от количества строк в массиве.... оно постепенно увеличивается.