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

标签 python numpy pass-by-reference generator yield

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

关于python - 迭代器的写权限?或者 : sending values to generators of numpy Arrays,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9921613/

相关文章:

python - NumPy 的/科学的 : why it is throwing error

python - 实时策略游戏的快速欧氏距离计算

c++ - 将临时对象作为参数传递 (C++)

python - wx.App (wxPython) 调用时崩溃

python - 如何添加两个嵌套的Python字典?

python - Python Numpy 中意外的傅立叶变换结果

c++ - 将对象实例作为函数参数传递——此代码是否调用未定义的行为?

pass-by-reference - D 关联数组 - 按值传递还是按引用传递?

python - 如何在 Windows 中安装没有 easy_install 的 .egg 文件?

python - 删除两个字符之间的所有内容,包括字符