Vraag Numpy Vector (N, 1) dimensie -> (N,) dimensieconversie


Ik heb een vraag over de conversie tussen (N,) dimensie-arrays en (N, 1) dimensie-arrays. Y is bijvoorbeeld (2,) dimensie.

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

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

y=np.dot(A,x)

y.shape
Out[6]: (2,)

Maar het volgende toont de dimensie y2 (2,1).

x2=x[:,np.newaxis]

y2=np.dot(A,x2)

y2.shape
Out[14]: (2, 1)

Wat zou de meest efficiënte manier zijn om y2 terug naar y te converteren zonder te kopiëren?

Bedankt, Tom


20
2017-07-25 22:25


oorsprong


antwoorden:


reshape werkt hiervoor

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

merk ook dat op reshape kopieert de gegevens alleen als het nodig is voor de nieuwe vorm (wat het hier niet hoeft te doen):

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

18
2017-07-26 01:24



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

6
2018-04-19 20:22



Snijd langs de gewenste dimensie, zoals in het onderstaande voorbeeld. Om in omgekeerde richting te gaan, kunt u gebruiken None als de slice voor elke dimensie die moet worden behandeld als een singleton-dimensie, maar die nodig is om shapes te laten werken.

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)

Als alternatief kunt u gebruiken reshape:

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

1
2017-07-25 22:29



de tegenovergestelde vertaling kan worden gemaakt door:

np.atleast_2d(y).T

0
2017-07-30 14:46