Skip to main content
 首页 » 编程设计

python之迭代器的写权限或者 : sending values to generators of numpy Arrays

2025年05月04日12qq78292959

我是 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)) 

我希望这里有传递引用语义,但事实似乎并非如此。

所以我尝试在我的 getArrayIterator 函数中使用 Python 的 send():

# ... 
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), first 和 last 是 row/col 向量。

所以有一组A,一组B,等等。每一个都属于我的应用程序中的一个网格点。

我现在想要一个遍历所有网格点的迭代器和一个遍历与每个网格点关联的矩阵的迭代器。

我想到的第一个想法是使用迭代器 c++ 样式来读写矩阵。但正如 agf 在下面指出的那样,这并不是一个真正可行的方法。所以我想我将使用不同的迭代器来进行读取访问,并使用专门的设置方法来为矩阵设置新值。

请您参考如下方法:

我假设这是一个简化的示例,因为对于您所拥有的类,似乎没有理由不使用普通列表。

当你这样做的时候

name = somelist[0] 
name = 'other' 

您将名称 name 指向 somelist 中第一个索引处的对象,然后将名称 name 指向对象 '其他'。您永远不会将 somelist[0] 指向 'other'。

所以除了send,你还需要实际赋值给列表:

class wrapper: 
    def __init__(self, myList): 
        self.myList = myList 
 
    def getArrayIterator(self): 
        for i, arr in enumerate(self.myList): 
            yarr = (yield arr) 
            if yarr is not None: 
                self.myList[i] = yarr 
 
#set list of arrays in wrapper 
myList = [1, 2, 3, 4, 5] 
w = wrapper(myList) 
witer = w.getArrayIterator() 
try: 
    a = next(witer) 
    for i in range(6, 11): 
        print a, 
        a = witer.send(i) 
except StopIteration: 
    pass 
print 
print w.myList