我是Python的迭代器的新手,所以也许我的语言并不总是正确的。写访问迭代器?或者:将值发送到numpy数组的生成器
我有一个类包装的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++风格来读取和写入矩阵。但正如agf指出的那样,这不是一个真正可行的方法。所以我想我会使用不同的迭代器来读取访问权限和专门的setter方法来为矩阵设置新的值。
我不确定你想要做什么是一种好的做法。也许有更好的方法来达到你所需要的。你能提供一个你的输入数组和期望输出的例子吗? – 2012-03-29 08:55:54
我不确定:D 整个类表示一个矩阵乘积状态,它是张量的某种分解方案,张量中的每个元素都表示为相关矩阵的乘积。例如,如果我有一个3阶张量,并且我想访问element_ijk,我实际上做了t_ijk = A(i)* A(j)* A(k)其中第一个和最后一个矩阵是行和列向量。每个索引i,j,k ...属于格上的物理索引,并且A矩阵存储在np.ndarray列表的列表中。所以我实际上需要两件事:... – 2012-03-29 09:29:29
...第一:我想遍历各个物理网格点上的矩阵集合。第二:我想独立迭代给定站点上的各个矩阵。 – 2012-03-29 09:31:09