Извлечение элементов из файла .npy, преобразование их в тензоры PyTorch - PullRequest
0 голосов
/ 19 апреля 2019

Я прочитал файл .npy, который содержит только метки для изображений.Метки хранятся в формате словаря.Мне нужно преобразовать это в массив тензоров.Но я не могу извлечь элементы одного из других из объекта, который возвращает файл, который имеет тип numpy.ndarray.


import numpy as np
data = np.load('/content/drive/My Drive/targets.npy')
print(data.item())


{0: array(5), 1: array(0), 2: array(4), 3: array(1), 4: array(9), 5: array(2), 6: array(1), 7: array(3)}

print(data[()].values())

dict_values([array(5), array(0), array(4), array(1), array(9), array(2), array(1), array(3)])

Я хотел бы вместо этого создать массив тензоров.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Предполагая, что ваш data является диктом:

In [59]: dct = {0: np.array([5]), 1: np.array([0]), 2: np.array([4]), 
                3: np.array([1]), 4: np.array([9]), 5: np.array([2]), 
                6: np.array([1]), 7: np.array([3])}

Вы можете использовать numpy.concatenate(), завернутый в torch.tensor(), чтобы получить из него тензор:

In [63]: torch.tensor(np.concatenate(list(dct.values())))
Out[63]: tensor([5, 0, 4, 1, 9, 2, 1, 3])

Кроме того, если вы хотите, чтобы ключи и значения были сложены в одном 2D-тензоре, используйте torch.cat()

# tensor with just keys
In [86]: tk = torch.tensor(list(dct.keys()))
In [87]: tk
Out[87]: tensor([0, 1, 2, 3, 4, 5, 6, 7])

# tensor with just values
In [88]: tv = torch.tensor(np.concatenate(list(dct.values())))
In [89]: tv
Out[89]: tensor([5, 0, 4, 1, 9, 2, 1, 3])

# horizontally stack them into a single 2D tensor
In [85]: torch.cat((tk[:, None], tv[:, None]), dim=1)
Out[85]: 
tensor([[0, 5],
        [1, 0],
        [2, 4],
        [3, 1],
        [4, 9],
        [5, 2],
        [6, 1],
        [7, 3]])

После серии комментариев я уже понял вашу проблему иВот способ решить эту проблему:

In [48]: data_item = {0: np.array(5), 1: np.array(0), 2: np.array(4), 
                      3: np.array(1), 4: np.array(9), 5: np.array(2),
                      6: np.array(1), 7: np.array(3)}

# convert keys to an 1D tensor
In [53]: tk = torch.tensor(list(data_item.keys()))

In [54]: tk
Out[54]: tensor([0, 1, 2, 3, 4, 5, 6, 7])

Поскольку у вас есть значения в виде массивов 0D (т.е. скаляров), нам нужно извлечь из них элементы.Для этого мы можем использовать функцию lambda вместе с map, задачей которой является применение лямбда-функции к итерируемому (здесь: data_item.values()) и предоставление нам элементов.Они могут быть переданы в torch.tensor, чтобы получить желаемый 1D тензор.

# convert values to an 1D tensor
In [57]: tv = torch.tensor(list(map(lambda a: a.item(), data_item.values())))

In [58]: tv
Out[58]: tensor([5, 0, 4, 1, 9, 2, 1, 3])

# horizontally stack them into a single 2D tensor, if needed
In [85]: torch.cat((tk[:, None], tv[:, None]), dim=1)
Out[85]: 
tensor([[0, 5],
        [1, 0],
        [2, 4],
        [3, 1],
        [4, 9],
        [5, 2],
        [6, 1],
        [7, 3]])
0 голосов
/ 19 апреля 2019

Ниже работал для меня, под руководством @ kmario23

import numpy as np
data = np.load('/content/drive/My Drive/targets.npy')
print(data.item())

{0: array(5), 1: array(0), 2: array(4), 3: array(1), 4: array(9), 5: array(2), 6: array(1), 7: array(3)}
# data is a 0-d numpy.ndarray that contains a dictionary. 

print(list(data[()].values()))

[array(5),
 array(0),
 array(4),
 array(1),
 array(9),
 array(2),
 array(1),
 array(3),
 array(1),
 array(4),
 array(3)]

# torch.Tensor(5) gives tensor([2.0581e-35, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00])
# torch.tensor(5) gives 5
# unsure of why the difference exists..

Labels = torch.stack([torch.tensor(i) for i in list_of_labels_array_form])

print(Labels)

tensor([5, 0, 4,  ..., 2, 5, 0])
...