Home

Awesome

<!-- DO NOT EDIT THIS FILE MANUALLY. This file is generated by generate_readme.py from conversions.yaml so please edit and run them. -->

PyTorch for Numpy users.

ci gh-pages

PyTorch version of Torch for Numpy users.
We assume you use the latest PyTorch and Numpy.

How to contribute?

git clone https://github.com/wkentaro/pytorch-for-numpy-users.git
cd pytorch-for-numpy-users
vim conversions.yaml
git commit -m "Update conversions.yaml"

./run_tests.py
<h2>Types</h2> <table> <thead> <tr><th>Numpy </th><th>PyTorch </th></tr> </thead> <tbody> <tr><td><pre> np.ndarray</pre></td><td><pre> torch.Tensor</pre> </td></tr> <tr><td><pre> np.float32</pre></td><td><pre> torch.float32; torch.float</pre> </td></tr> <tr><td><pre> np.float64</pre></td><td><pre> torch.float64; torch.double</pre></td></tr> <tr><td><pre> np.float16</pre></td><td><pre> torch.float16; torch.half</pre> </td></tr> <tr><td><pre> np.int8</pre> </td><td><pre> torch.int8</pre> </td></tr> <tr><td><pre> np.uint8</pre> </td><td><pre> torch.uint8</pre> </td></tr> <tr><td><pre> np.int16</pre> </td><td><pre> torch.int16; torch.short</pre> </td></tr> <tr><td><pre> np.int32</pre> </td><td><pre> torch.int32; torch.int</pre> </td></tr> <tr><td><pre> np.int64</pre> </td><td><pre> torch.int64; torch.long</pre> </td></tr> </tbody> </table> <h2>Ones and zeros</h2> <table> <thead> <tr><th>Numpy </th><th>PyTorch </th></tr> </thead> <tbody> <tr><td><pre> np.empty((2, 3))</pre></td><td><pre> torch.empty(2, 3)</pre> </td></tr> <tr><td><pre> np.empty_like(x)</pre></td><td><pre> torch.empty_like(x)</pre></td></tr> <tr><td><pre> np.eye</pre> </td><td><pre> torch.eye</pre> </td></tr> <tr><td><pre> np.identity</pre> </td><td><pre> torch.eye</pre> </td></tr> <tr><td><pre> np.ones</pre> </td><td><pre> torch.ones</pre> </td></tr> <tr><td><pre> np.ones_like</pre> </td><td><pre> torch.ones_like</pre> </td></tr> <tr><td><pre> np.zeros</pre> </td><td><pre> torch.zeros</pre> </td></tr> <tr><td><pre> np.zeros_like</pre> </td><td><pre> torch.zeros_like</pre> </td></tr> </tbody> </table> <h2>From existing data</h2> <table> <thead> <tr><th>Numpy </th><th>PyTorch </th></tr> </thead> <tbody> <tr><td><pre> np.array([[1, 2], [3, 4]])</pre> </td><td><pre> torch.tensor([[1, 2], [3, 4]])</pre> </td></tr> <tr><td><pre> np.array([3.2, 4.3], dtype=np.float16) np.float16([3.2, 4.3]) </pre></td><td><pre> torch.tensor([3.2, 4.3], dtype=torch.float16)</pre></td></tr> <tr><td><pre> x.copy()</pre> </td><td><pre> x.clone()</pre> </td></tr> <tr><td><pre> x.astype(np.float32)</pre> </td><td><pre> x.type(torch.float32); x.float()</pre> </td></tr> <tr><td><pre> np.fromfile(file)</pre> </td><td><pre> torch.tensor(torch.Storage(file))</pre> </td></tr> <tr><td><pre> np.frombuffer</pre> </td><td> </td></tr> <tr><td><pre> np.fromfunction</pre> </td><td> </td></tr> <tr><td><pre> np.fromiter</pre> </td><td> </td></tr> <tr><td><pre> np.fromstring</pre> </td><td> </td></tr> <tr><td><pre> np.load</pre> </td><td><pre> torch.load</pre> </td></tr> <tr><td><pre> np.loadtxt</pre> </td><td> </td></tr> <tr><td><pre> np.concatenate</pre> </td><td><pre> torch.cat</pre> </td></tr> </tbody> </table> <h2>Numerical ranges</h2> <table> <thead> <tr><th>Numpy </th><th>PyTorch </th></tr> </thead> <tbody> <tr><td><pre> np.arange(10)</pre> </td><td><pre> torch.arange(10)</pre> </td></tr> <tr><td><pre> np.arange(2, 3, 0.1)</pre></td><td><pre> torch.arange(2, 3, 0.1)</pre></td></tr> <tr><td><pre> np.linspace</pre> </td><td><pre> torch.linspace</pre> </td></tr> <tr><td><pre> np.logspace</pre> </td><td><pre> torch.logspace</pre> </td></tr> </tbody> </table> <h2>Linear algebra</h2> <table> <thead> <tr><th>Numpy </th><th>PyTorch </th></tr> </thead> <tbody> <tr><td><pre> np.dot</pre> </td><td><pre> torch.dot # 1D arrays only torch.mm # 2D arrays only torch.mv # matrix-vector (2D x 1D) </pre></td></tr> <tr><td><pre> np.matmul</pre> </td><td><pre> torch.matmul</pre> </td></tr> <tr><td><pre> np.tensordot</pre></td><td><pre> torch.tensordot</pre> </td></tr> <tr><td><pre> np.einsum</pre> </td><td><pre> torch.einsum</pre> </td></tr> </tbody> </table> <h2>Building matrices</h2> <table> <thead> <tr><th>Numpy </th><th>PyTorch </th></tr> </thead> <tbody> <tr><td><pre> np.diag</pre></td><td><pre> torch.diag</pre></td></tr> <tr><td><pre> np.tril</pre></td><td><pre> torch.tril</pre></td></tr> <tr><td><pre> np.triu</pre></td><td><pre> torch.triu</pre></td></tr> </tbody> </table> <h2>Attributes</h2> <table> <thead> <tr><th>Numpy </th><th>PyTorch </th></tr> </thead> <tbody> <tr><td><pre> x.shape</pre> </td><td><pre> x.shape; x.size()</pre></td></tr> <tr><td><pre> x.strides</pre></td><td><pre> x.stride()</pre> </td></tr> <tr><td><pre> x.ndim</pre> </td><td><pre> x.dim()</pre> </td></tr> <tr><td><pre> x.data</pre> </td><td><pre> x.data</pre> </td></tr> <tr><td><pre> x.size</pre> </td><td><pre> x.nelement()</pre> </td></tr> <tr><td><pre> x.dtype</pre> </td><td><pre> x.dtype</pre> </td></tr> </tbody> </table> <h2>Indexing</h2> <table> <thead> <tr><th>Numpy </th><th>PyTorch </th></tr> </thead> <tbody> <tr><td><pre> x[0]</pre> </td><td><pre> x[0]</pre> </td></tr> <tr><td><pre> x[:, 0]</pre> </td><td><pre> x[:, 0]</pre> </td></tr> <tr><td><pre> x[indices]</pre> </td><td><pre> x[indices]</pre> </td></tr> <tr><td><pre> np.take(x, indices)</pre></td><td><pre> torch.take(x, torch.LongTensor(indices))</pre></td></tr> <tr><td><pre> x[x != 0]</pre> </td><td><pre> x[x != 0]</pre> </td></tr> </tbody> </table> <h2>Shape manipulation</h2> <table> <thead> <tr><th>Numpy </th><th>PyTorch </th></tr> </thead> <tbody> <tr><td><pre> x.reshape</pre> </td><td><pre> x.reshape; x.view</pre> </td></tr> <tr><td><pre> x.resize()</pre> </td><td><pre> x.resize_</pre> </td></tr> <tr><td> </td><td><pre> x.resize_as_</pre> </td></tr> <tr><td><pre> x = np.arange(6).reshape(3, 2, 1) x.transpose(2, 0, 1) # 012 -> 201 </pre></td><td><pre> x = torch.arange(6).reshape(3, 2, 1) x.permute(2, 0, 1); x.transpose(1, 2).transpose(0, 1) # 012 -> 021 -> 201 </pre></td></tr> <tr><td><pre> x.flatten</pre> </td><td><pre> x.view(-1)</pre> </td></tr> <tr><td><pre> x.squeeze()</pre> </td><td><pre> x.squeeze()</pre> </td></tr> <tr><td><pre> x[:, None]; np.expand_dims(x, 1)</pre> </td><td><pre> x[:, None]; x.unsqueeze(1)</pre> </td></tr> </tbody> </table> <h2>Item selection and manipulation</h2> <table> <thead> <tr><th>Numpy </th><th>PyTorch </th></tr> </thead> <tbody> <tr><td><pre> np.put</pre> </td><td> </td></tr> <tr><td><pre> x.put</pre> </td><td><pre> x.put_</pre> </td></tr> <tr><td><pre> x = np.array([1, 2, 3]) x.repeat(2) # [1, 1, 2, 2, 3, 3] </pre> </td><td><pre> x = torch.tensor([1, 2, 3]) x.repeat_interleave(2) # [1, 1, 2, 2, 3, 3] x.repeat(2) # [1, 2, 3, 1, 2, 3] x.repeat(2).reshape(2, -1).transpose(1, 0).reshape(-1) # [1, 1, 2, 2, 3, 3] </pre></td></tr> <tr><td><pre> np.tile(x, (3, 2))</pre> </td><td><pre> x.repeat(3, 2)</pre> </td></tr> <tr><td><pre> x = np.array([[0, 1], [2, 3], [4, 5]]) idxs = np.array([0, 2]) np.choose(idxs, x) # [0, 5] </pre></td><td><pre> x = torch.tensor([[0, 1], [2, 3], [4, 5]]) idxs = torch.tensor([0, 2]) x[idxs, torch.arange(x.shape[1])] # [0, 5] torch.gather(x, 0, idxs[None, :])[0] # [0, 5] </pre> </td></tr> <tr><td><pre> np.sort</pre> </td><td><pre> sorted, indices = torch.sort(x, [dim])</pre> </td></tr> <tr><td><pre> np.argsort</pre> </td><td><pre> sorted, indices = torch.sort(x, [dim])</pre> </td></tr> <tr><td><pre> np.nonzero</pre> </td><td><pre> torch.nonzero</pre> </td></tr> <tr><td><pre> np.where</pre> </td><td><pre> torch.where</pre> </td></tr> <tr><td><pre> x[::-1]</pre> </td><td><pre> torch.flip(x, [0])</pre> </td></tr> <tr><td><pre> np.unique(x)</pre> </td><td><pre> torch.unique(x)</pre> </td></tr> </tbody> </table> <h2>Calculation</h2> <table> <thead> <tr><th>Numpy </th><th>PyTorch </th></tr> </thead> <tbody> <tr><td><pre> x.min</pre> </td><td><pre> x.min</pre> </td></tr> <tr><td><pre> x.argmin</pre> </td><td><pre> x.argmin</pre> </td></tr> <tr><td><pre> x.max</pre> </td><td><pre> x.max</pre> </td></tr> <tr><td><pre> x.argmax</pre> </td><td><pre> x.argmax</pre> </td></tr> <tr><td><pre> x.clip</pre> </td><td><pre> x.clamp</pre> </td></tr> <tr><td><pre> x.round</pre> </td><td><pre> x.round</pre> </td></tr> <tr><td><pre> np.floor(x)</pre> </td><td><pre> torch.floor(x); x.floor()</pre></td></tr> <tr><td><pre> np.ceil(x)</pre> </td><td><pre> torch.ceil(x); x.ceil()</pre> </td></tr> <tr><td><pre> x.trace</pre> </td><td><pre> x.trace</pre> </td></tr> <tr><td><pre> x.sum</pre> </td><td><pre> x.sum</pre> </td></tr> <tr><td><pre> x.sum(axis=0)</pre></td><td><pre> x.sum(0)</pre> </td></tr> <tr><td><pre> x.cumsum</pre> </td><td><pre> x.cumsum</pre> </td></tr> <tr><td><pre> x.mean</pre> </td><td><pre> x.mean</pre> </td></tr> <tr><td><pre> x.std</pre> </td><td><pre> x.std</pre> </td></tr> <tr><td><pre> x.prod</pre> </td><td><pre> x.prod</pre> </td></tr> <tr><td><pre> x.cumprod</pre> </td><td><pre> x.cumprod</pre> </td></tr> <tr><td><pre> x.all</pre> </td><td><pre> x.all</pre> </td></tr> <tr><td><pre> x.any</pre> </td><td><pre> x.any</pre> </td></tr> </tbody> </table> <h2>Arithmetic and comparison operations</h2> <table> <thead> <tr><th>Numpy </th><th>PyTorch </th></tr> </thead> <tbody> <tr><td><pre> np.less</pre> </td><td><pre> x.lt</pre></td></tr> <tr><td><pre> np.less_equal</pre> </td><td><pre> x.le</pre></td></tr> <tr><td><pre> np.greater</pre> </td><td><pre> x.gt</pre></td></tr> <tr><td><pre> np.greater_equal</pre></td><td><pre> x.ge</pre></td></tr> <tr><td><pre> np.equal</pre> </td><td><pre> x.eq</pre></td></tr> <tr><td><pre> np.not_equal</pre> </td><td><pre> x.ne</pre></td></tr> </tbody> </table> <h2>Random numbers</h2> <table> <thead> <tr><th>Numpy </th><th>PyTorch </th></tr> </thead> <tbody> <tr><td><pre> np.random.seed</pre> </td><td><pre> torch.manual_seed</pre></td></tr> <tr><td><pre> np.random.permutation(5)</pre></td><td><pre> torch.randperm(5)</pre></td></tr> </tbody> </table> <h2>Numerical operations</h2> <table> <thead> <tr><th>Numpy </th><th>PyTorch </th></tr> </thead> <tbody> <tr><td><pre> np.sign</pre></td><td><pre> torch.sign</pre></td></tr> <tr><td><pre> np.sqrt</pre></td><td><pre> torch.sqrt</pre></td></tr> </tbody> </table>