我有一个关于(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的最有效方法是什么?谢谢,汤姆
ozxc1zmp1#
reshape适用于此
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)
czfnxgou2#
使用numpy.squeeze:
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)
bihw5rsg3#
如以下示例所示,沿着所需的维进行切片。若要反向进行,可以使用None作为任何维的切片,这些维应视为单一维,但需要使形状正常工作。
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])
vwkv1x7d4#
相反的转换可以通过以下方式进行:
np.atleast_2d(y).T
bxpogfeg5#
工具箱中的另一个选项可能是ravel:
ravel
>>> y2.shape (2, 1) >>> y_ = y2.ravel() >>> y_.shape (2,)
同样,* 仅 * 在需要时才制作副本,但实际情况并非如此:
>>> y2.__array_interface__["data"] (2700295136768, False) >>> y_.__array_interface__["data"] (2700295136768, False)
要了解更多详细信息,您可以查看this answer。
5条答案
按热度按时间ozxc1zmp1#
reshape
适用于此还要注意,
reshape
不会复制数据,除非它需要复制新的形状(这里不需要复制):czfnxgou2#
使用
numpy.squeeze
:bihw5rsg3#
如以下示例所示,沿着所需的维进行切片。若要反向进行,可以使用
None
作为任何维的切片,这些维应视为单一维,但需要使形状正常工作。或者,您可以使用
reshape
:vwkv1x7d4#
相反的转换可以通过以下方式进行:
bxpogfeg5#
工具箱中的另一个选项可能是
ravel
:同样,* 仅 * 在需要时才制作副本,但实际情况并非如此:
要了解更多详细信息,您可以查看this answer。