简体   繁体   中英

Why does indexing a matrix by an integer produce a different shape than the dot product with a one hot vector in numpy?

I have a matrix that I initialized with numpy.random.uniform like so:

W = np.random.uniform(-1, 1, (V,N))

In my case, V = 10000 and N = 50 , x is a positive integer

When I multiply W by a one hot vector x_vec of dimension VX 1, like WTdot(x_vec) , I get a column vector with a shape of (50,1). When I try to get the same vector by indexing W, as in W[x].T or W[x,:].T I get shape (50,).

Can anyone explain to me why these two expression return different shapes and if it's possible to return a (50,1) matrix (vector) with the indexing method. The vector of shape (50,) is problematic because it doesn't behave the same way as the (50,1) vector when I multiply it with other matrices, but I'd like to use indexing to speed things up a little.

*Sorry in advance if this question should be in a place like Cross Validated instead of Stack Exchange

They are different operations. matrix (in the maths sense) times matrix gives matrix, some of your matrices just happen to have width 1. Indexing with an integer scalar eats the dimension you are indexing into. Once you are down to a single dimension, .T does nothing because it doesn't have enough axes to shuffle.

If you want to go from (50,) to (50, 1) shape-wise, the recipe is indexing with None like so v[:, None] . In your case you have at least two one-line options:

W[x, :][:, None] # or W[x][:, None]     or
W[x:x+1, :].T    # or W[x:x+1].T

The second-line option preserves the first dimension of W by requesting a subrange of length one. The first option can be contracted into a single indexing operation - thanks to @hpaulj for pointing this out - which gives the arguably most readable option:

W[x, :, None]

The first index (scalar integer x ) consumes the first dimension of W , the second dimension (unaffected by : ) becomes the first and None creates a new dimension on the right.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM