2017-01-12 2 views
1

У меня есть функция генератора, который вычисляет некоторые позиции среза в виде Numpy массива следующим образом:Сохранение кортежа из генератора словаря в Python

import numpy as np 
from itertools import product 

def __get_slices(data_shape, start, offset, width, patch_size): 
    start_indices = [range(start[d] - offset if (start[d] - offset) >= 0 else 0, 
          start[d] - offset + width 
          if (start[d] - offset + width) <= data_shape[d] 
          else data_shape[d]) 
        for d in range(len(data_shape))] 

    start_coords = product(*start_indices) 

    for start_coord in start_coords: 
     yield tuple(slice(coord, coord + patch_size) for coord in start_coord) 

Теперь я хотел бы сохранить этот сгенерированный кортеж в словаре, который barfs с a TypeError исключение, потому что я предполагаю, что объект slice - mutable. Есть ли способ сделать его неизменным через некоторые функции python и сохранить его в словаре?

На python2.7, я получаю следующее сообщение об ошибке при попытке назначить его в словарь:

TypeError: unhashable type 
+1

А, объекты ломтика действительно не сотрясаются, с целью: [Почему объекты среза не хешируются в python] (// stackoverflow.com/q/29980786) –

+1

@cxw: 'TypeError: unhashable type: 'slice'' будет быть ошибкой. Я могу, конечно, воспроизвести это. –

+0

@MartijnPieters А это интересно. Я попытаюсь использовать метод 'reduce', как показано в этом потоке, поскольку мы :;/ – Luca

ответ

2

Действительно, slice() объекты являются unhashable, on purpose, чтобы убедиться, что dict[slice] = something вызывает исключение:

>>> d = {} 
>>> d[42:81] = 'foobar' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'slice' 

Вам придется поселиться для другого объекта и создать срезы из этих позже. Магазин кортежи, например:

yield tuple((coord, coord + patch_size) for coord in start_coord) 

и превратить эти кружочки позже, когда вам нужно применить эти, с slice(*tup).

+0

Это хорошее предложение. Благодарю. Я соглашусь, как только закончится срок! – Luca

Смежные вопросы