Numpy向量(N,1)维度 -> (N,)维度转换

45
我有一个关于(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?

谢谢, 汤姆

5个回答

58

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)

24

使用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)

2
当数据的维度未知或获取适当的维度存在太多问题时,使用这种方法更为合适。 - Prasad Raghavendra

5

按照您想要的维度进行切片,就像下面的例子一样。如果要沿相反方向进行操作,可以在任何应被视为单例维度但仍需要使形状正常工作的维度上使用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])

1

你工具箱中的另一个选择可能是 ravel

>>> y2.shape
(2, 1)
>>> y_ = y2.ravel()
>>> y_.shape
(2,)

再次强调,只有在需要时才会进行复制,但这并非现在的情况:

>>> y2.__array_interface__["data"]
(2700295136768, False)
>>> y_.__array_interface__["data"]
(2700295136768, False)

如需更多详细信息,您可以查看此答案


0

相反的翻译可以这样做:

np.atleast_2d(y).T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接