Преобразование размерности векторного изображения (N, 1) → (N,)
У меня есть вопрос относительно преобразования между (N,) размерными массивами и (N, 1) размерными массивами. Например, y является (2,) размером.
A=np.array([[1,2],[3,4]])
x=np.array([1,2])
y=np.dot(A,x)
y.shape
Out[6]: (2,)
Но следующее показывает, что y2 будет (2,1).
x2=x[:,np.newaxis]
y2=np.dot(A,x2)
y2.shape
Out[14]: (2, 1)
Каким будет наиболее эффективный способ преобразования y2 обратно в y без копирования?
Спасибо,
Том
Ответы
Ответ 1
reshape
работает для этого
a = np.arange(3) # a.shape = (3,)
b = a.reshape((3,1)) # b.shape = (3,1)
b2 = a.reshape((-1,1)) # b2.shape = (3,1)
c = b.reshape((3,)) # c.shape = (3,)
c2 = b.reshape((-1,)) # c2.shape = (3,)
обратите внимание также, что reshape
не копирует данные, если это не требуется для новой формы (что здесь не нужно делать):
a.__array_interface__['data'] # (22356720, False)
b.__array_interface__['data'] # (22356720, False)
c.__array_interface__['data'] # (22356720, False)
Ответ 2
Используйте numpy.squeeze
:
>>> x = np.array([[[0], [1], [2]]])
>>> x.shape
(1, 3, 1)
>>> np.squeeze(x).shape
(3,)
>>> np.squeeze(x, axis=(2,)).shape
(1, 3)
Ответ 3
Нарезьте нужный размер, как в примере ниже. Чтобы перейти в обратном направлении, вы можете использовать None
в качестве среза для любого измерения, которое должно рассматриваться как одноэлементное измерение, но которое необходимо для создания фигур.
In [786]: yy = np.asarray([[11],[7]])
In [787]: yy
Out[787]:
array([[11],
[7]])
In [788]: yy.shape
Out[788]: (2, 1)
In [789]: yy[:,0]
Out[789]: array([11, 7])
In [790]: yy[:,0].shape
Out[790]: (2,)
In [791]: y1 = yy[:,0]
In [792]: y1.shape
Out[792]: (2,)
In [793]: y1[:,None]
Out[793]:
array([[11],
[7]])
In [794]: y1[:,None].shape
Out[794]: (2, 1)
В качестве альтернативы вы можете использовать reshape
:
In [795]: yy.reshape((2,))
Out[795]: array([11, 7])
Ответ 4
противоположный перевод может быть сделан:
np.atleast_2d(y).T