Suppose we have [3,2,2] matrix
So, I need all index like:
[[0,0,0],[0,0,1]…[2,1,1]]
If I understand correctly, you want something like this.
If not, please let me know.
Hope this helps
import torch
import itertools
t = torch.rand((3, 2, 2))
shape = t.shape
y = torch.tensor(list(itertools.product(range(len(shape)), repeat=len(shape))))
for i, max in enumerate(shape):
y = y[ y[:, i] < max ]
print(y)
# Output:
tensor([[0, 0, 0],
[0, 0, 1],
[0, 1, 0],
[0, 1, 1],
[1, 0, 0],
[1, 0, 1],
[1, 1, 0],
[1, 1, 1],
[2, 0, 0],
[2, 0, 1],
[2, 1, 0],
[2, 1, 1]])
Yes, that’s what I need, you helped a lot.
If this process could be simpler, that’s the best.
Thank you
If what you want is to access every value consecutively, then you can do something like this:
t = torch.rand((3, 2, 2))
print(t)
for i in range(len(t.view(-1))):
print(t.view(-1)[i])
Yeah, I know that.
Unfortunately, I can’t access these values directly.
Anyway, thanks and wish you all be good.
@Matias_Vasquez
Hi, I find that there might have been a bug existing,
shape = [64,3,7,7]
idx = torch.tensor(list(itertools.product(range(len(shape)), repeat=len(shape))))
for i,right_b in enumerate(shape):
idx = idx[ idx[:,i]<right_b]
Oops, inside the product it has to be the maximum number, not the length
shape = [64,3,7,7]
idx = torch.tensor(list(itertools.product(range(max(shape)), repeat=len(shape))))
for i,right_b in enumerate(shape):
idx = idx[ idx[:,i]<right_b]
This might be more efficient, since the other answer has to create all of the different permutations, taking the maximum in every dimension.
t = torch.rand((64, 3, 7, 7))
B, C, H, W = t.shape
y = torch.tensor([[b, c, h, w] for b in range(B) for c in range(C) for h in range(H) for w in range(W)])
print(y)
Yes, but dimensions of tensor might be changed, so I need some adaptive ways to solve that.
Here should be a generic solution for n
dimensions.
Not the most elegant, but also works.
import torch
import numpy as np
t = torch.rand((64, 3, 7, 7))
z = torch.tensor([[0] * len(t.shape)] * np.prod(t.shape))
shape = t.shape
for i in range(-1, -1-len(shape), -1):
if i == -1:
z[:, i] = torch.tensor(
[j for j in range(shape[i])] * (int)(np.prod(shape)/(np.prod(shape[i:])))
)
else:
z[:, i] = torch.tensor(
[j for j in range(shape[i]) for _ in range(np.prod(shape[i+1:]))] * (int)(np.prod(shape)/(np.prod(shape[i:])))
)
print(z)