Numpy Vector (N,1) dimension -> (N,) dimension conversion

匿名 (未验证) 提交于 2019-12-03 01:54:01

问题:

I have a question regarding the conversion between (N,) dimension arrays and (N,1) dimension arrays. For example, y is (2,) dimension.

A=np.array([[1,2],[3,4]])  x=np.array([1,2])  y=np.dot(A,x)  y.shape Out[6]: (2,) 

But the following will show y2 to be (2,1) dimension.

x2=x[:,np.newaxis]  y2=np.dot(A,x2)  y2.shape Out[14]: (2, 1) 

What would be the most efficient way of converting y2 back to y without copying?

Thanks, Tom

回答1:

reshape works for this

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,) 

note also that reshape doesn't copy the data unless it needs to for the new shape (which it doesn't need to do here):

a.__array_interface__['data']   # (22356720, False) b.__array_interface__['data']   # (22356720, False) c.__array_interface__['data']   # (22356720, False) 


回答2:

Use 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:

Slice along the dimension you want, as in the example below. To go in the reverse direction, you can use None as the slice for any dimension that should be treated as a singleton dimension, but which is needed to make shapes work.

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) 

Alternatively, you can use reshape:

In [795]: yy.reshape((2,)) Out[795]: array([11,  7]) 


回答4:

the opposite translation can be made by:

np.atleast_2d(y).T 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!