Как сделать массив с двумерной формой

У меня есть простой массив, как это

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

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

Но я не хочу возвращать форму (4,), но (4,1). Как мне этого добиться?

5 ответов

Обычно в Numpy вы объявляете матрицу или вектор, используя two square brackets, Распространено заблуждение использовать одиночные квадратные скобки для одномерной матрицы или вектора.

Вот пример:

a = np.array([[1,2,3,4], [5,6,7,8]])
a.shape # (2,4) -> Multi-Dimensional Matrix

Аналогичным образом, если я хочу одномерную матрицу, просто удалите данные, а не внешние square bracket,

a = np.array([[1,2,3,4]])
a.shape # (1,4) -> Row Matrix

b = np.array([[1], [2], [3], [4]])
b.shape # (4, 1) -> Column Matrix

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

Всегда заключайте ваши данные в другую квадратную скобку для такой одномерной матрицы (как вы вводите данные для многомерной матрицы) без данных для этих дополнительных измерений.

Также: Вы также можете всегда изменить форму

x = np.array([1,2,3,4])
x = x.reshape(4,1)
x.shape # (4,1)

Одна линия:

x = np.array([1,2,3,4]).reshape(4,1)
x.shape # (4,1)

Если вы хотите использовать вектор-столбец

x2 = x[:, np.newaxis]
x2.shape  # (4, 1)

Кроме того, вы можете изменить форму массива самостоятельно:

arr1 = np.array([1,2,3,4])
print arr1.shape
# (4,)

arr2 = arr1.reshape((4,1))
print arr2.shape
# (4, 1)

Конечно, вы можете изменить массив при создании:

arr1 = np.array([1,2,3,4]).reshape((4,1))

Если вы хотите изменить массив на месте, как предложено @FHTMitchell в комментариях:

arr1.resize((4, 1))

Ниже добивается того, что вы хотите. Тем не менее, я настоятельно рекомендую вам посмотреть, почему именно вам нужно shape вернуться (4, 1). Большинство операций матричного типа возможны без явного приведения.

x = np.array([1,2,3,4])
y = np.matrix(x)
z = y.T

x.shape  # (4,)
y.shape  # (1, 4)
z.shape  # (4, 1)

Ты можешь использовать zip транспонировать на уровне Python (не NumPy):

>>> a = [1, 2, 3, 4]
>>> 
>>> *zip(a),
((1,), (2,), (3,), (4,))
>>> 
>>> import numpy as np
>>> np.array([*zip(a)])
array([[1],
       [2],
       [3],
       [4]])

Обратите внимание, что, хотя это удобно с точки зрения нажатия клавиш, это немного расточительно, учитывая, что объект кортежа должен создаваться для каждого элемента списка, тогда как изменение формы массива происходит по существу бесплатно. Так что не используйте это в длинных списках.

Другие вопросы по тегам