2016-10-18 2 views
0

У меня есть следующая проблема, в которой я хочу сгенерировать шаблоны с введенным значением 0. Проблема в том, что это должно быть экономически эффективно, и поэтому я хотел бы использовать генератор, который создает и возвращает один из шаблонов за раз (т. Е. Я не хочу создавать список и возвращать его.) Я в недоумении здесь, потому что я не знаю, что я делаю неправильно при вызове генератора, поэтому любая помощь будет оценена!Генератор, который дает подшаблоны исходного шаблона с введенными нулями

оригинальный рисунок = [0. 1. 1. 2.] генератор должен генерировать и возвращать эти: [0. 0. 1. 2.], [0. 1. 0. 2.], [0. 1. 1. 0.]

Однако я могу просто привести один из шаблонов с вызовом генератора (дополнительный 1.0 не является проблемой, чтобы не вызвать никаких путаница ...), и не все из них последовательно.

дали подшаблонов = (массив ([0, 1, 0, 2]), 1,0)

Ниже мой код:

import numpy as np 
def removeoneletter(subpattern): 
    # generator = [] 
    originalpattern = subpattern 
    subpatterncopy = subpattern.copy() 
    nonzero = np.nonzero(subpattern) 
    listnonzero = nonzero[0].tolist() 
# only replace elements at nonzero positions with zero 
    for i in listnonzero: 
      subpatterncopy = subpattern.copy() 
      position = i 
      transaction = subpatterncopy[i] 
      np.put(subpatterncopy, position, 0) 
      print('subpattern generator') 
      print(subpatterncopy) 
      # generator.append((subpatterncopy, transaction)) 
      yield((subpatterncopy, transaction)) 
      if i == len(listnonzero): 
       break 

и функция вызывается с помощью другая функция так:

def someotherfunction(): 

    combinations = removeoneletter(subpatterncopy) 

    for x in combinations: 
     # x = next(combinations) 
     print('yielded subpattern') 
     print(x) 
+0

Конечно, извините, я не видел, что он не поддерживался. Я добавил пробелы и надеюсь, что они теперь точны. Спасибо. – trummelbummel

+0

Вы должны упомянуть, что это проблема с numpy и соответственно добавить «import numpy as np». –

+0

эй да, я добавил импорт. Однако это не проблема. Потому что код генерирует шаблоны просто отлично. Это проблема с уступкой от генератора. Однако я понял, что он делает то, что должен делать с отправленным кодом. Но что-то в задней части какой-то функции испортило то, что я пытался сделать. В основном это проблема с отступом. Я решил это сейчас. Возможно, остальная часть кода может помочь другому человеку. Поэтому я переименую вопрос. – trummelbummel

ответ

0

Не будучи специалистом Numpy, эта часть выглядит немного странно для меня:

for i in listnonzero: 
    .... 
    if i == len(listnonzero): 
      break 

Ваш цикл for присваивает элементам listnonzero значение i, а затем вы проверяете это по длине списка. Если у listnonzero было пять элементов [5,42,6,77,12], а первый элемент, который вы выбираете из списка, является номером 5, вы должны разбить цикл и выйти после первой итерации.

Ваш код будет (возможно) работать в Javascript или аналогичном, где «for i in something» присваивает индекс i вместо члена списка.

Если это не поможет, попробуйте удалить доход и добавить инструкцию печати, чтобы узнать, являются ли ваши listnonzero и я тем, что вы ожидаете от них.

Просто мысль.

Hannu