Я новичок в итераторах Python, поэтому, возможно, мой язык не всегда правильный.
У меня есть класс, заключающий в список numpy.ndarray
:
class wrapper:
def __init__(self, myList):
self.myList = myList
def getArrayIterator(self):
for arr in self.myList:
yield arr
#set list of arrays in wrapper
myList = [rand(3,3), rand(3,3), rand(3,3)]
w = wrapper(myList)
Как я понял, второй метод возвращает генератор.
Теперь я хочу использовать этот генератор для циклического перемещения по списку и сброса массивов в другое значение:
for a in w.getArrayIterator():
a = zeros((3,4))
Я надеялся получить здесь семантику ссылок, но, похоже, это не так.
Итак, я попытался использовать Python send()
в моей функции getArrayIterator
:
# ...
def getArrayIterator(self):
for arr in self.myList:
val = (yield arr)
if val is not None:
arr = val
# ...
Но это тоже не сработает, потому что:
a.send(zeros((3,4)))
AttributeError: 'numpy.ndarray' object has no attribute 'send'
Есть ли простое решение для достижения желаемого поведения?
Я что-то упустил?
РЕДАКТИРОВАТЬ: Мне было указано, что я должен предоставить больше информации о моей реальной проблеме. Приведенный выше пример, конечно, упрощен.
У меня есть список списков numpy.ndarray
, представляющих тензор T, инкапсулированный в моем классе. При доступе к элементу T: t_ijkl
мне нужно умножить матрицы, хранящиеся в списке: A(i)*B(j)*C(k)*D(l)
, первый и последний - векторы строки / столбца.
Итак, в моем приложении есть набор A, набор B и т. Д. Каждый из них принадлежит точке сетки.
Теперь я хотел иметь итератор для всех точек сетки и итераторы для матриц, связанных с каждой точкой сетки.
Первой идеей, которая пришла в голову, было использование итераторов в стиле c ++ для чтения и записи матриц. Но, как указано ниже, это не совсем осуществимый подход. Поэтому я думаю, что я буду использовать разные итераторы только для доступа на чтение и специализированные методы установки для установки новых значений для матриц.