Numpy implementation in Pytorch

Hi,

In numpy, we use `x[:, None]`. This is frequently used to elementwise matrix multiplication.

E.g.

``````x = np.array([1.8507 ,-2.7324])
y = np.array([0.9722 , 0.4470 , 1.0000 , 0.0000 , 0.0000 , 0.0000])
``````

If we do, `x * y`, we will get the error:

ValueError: operands could not be broadcast together with shapes (2,) (6,)

But `x * y[:,None]`, will give us

``````array([[ 1.79925054, -2.65643928],
[ 0.8272629 , -1.2213828 ],
[ 1.8507    , -2.7324    ],
[ 0.        , -0.        ],
[ 0.        , -0.        ],
[ 0.        , -0.        ]])
``````

Is there pytorch implementation of this kind of functionality?

Thank you!

maybe `unsqueeze` is what you want

@chenchr: Thanks for your suggestion. I tried unsqueeze. But I could not get the desired answer. Will it be possible for you to show me the code, how to get the final result Iâ€™m getting using numpy?

Thank you!

There was a bug when doing `[:, None]` indexing in PyTorch.
It was fixed 2 days ago in https://github.com/pytorch/pytorch/pull/2779

If we compile with latest master, we get the same result in PyTorch too:

``````import numpy as np
x = np.array([1.8507 ,-2.7324])
y = np.array([0.9722 , 0.4470 , 1.0000 , 0.0000 , 0.0000 , 0.0000])
print(x * y[:, None])
# array([[ 1.79925054, -2.65643928],
#       [ 0.8272629 , -1.2213828 ],
#       [ 1.8507    , -2.7324    ],
#       [ 0.        , -0.        ],
#       [ 0.        , -0.        ],
#       [ 0.        , -0.        ]])

print(torch.from_numpy(x) * torch.from_numpy(y)[:, None])

# 1.7993 -2.6564
# 0.8273 -1.2214
# 1.8507 -2.7324
# 0.0000 -0.0000
# 0.0000 -0.0000
# 0.0000 -0.0000
#[torch.DoubleTensor of size 6x2]
``````
1 Like

Thanks @smth: With new version (0.2.0) I can run the code. Even with torch tensor object. This is awesome!

``````x = np.array([1.8507 ,-2.7324])
y = np.array([0.9722 , 0.4470 , 1.0000 , 0.0000 , 0.0000 , 0.0000])
x = torch.from_numpy(x)
y = torch.from_numpy(y)
z = x.unsqueeze(0)*y.unsqueeze(1)
print(z)
``````

or

``````x = np.array([1.8507 ,-2.7324])
y = np.array([0.9722 , 0.4470 , 1.0000 , 0.0000 , 0.0000 , 0.0000])
x = torch.from_numpy(x)
y = torch.from_numpy(y)
z = x*y.unsqueeze(1)
print(z)
``````

both work on my computer. I prefer the former as it explicit specifies the tensor shape.

1 Like

@chenchr: Thanks for your suggestion. I could solve the problem using Smithâ€™s method. But this alternative solution also helped me to understand performance of â€śunsqueezeâ€ť better. Iâ€™m still new to pytorch. So taking sometime to grab the new concepts.