私はPythonのイテレータには新しく、多分私の言語が正しいとは限りません。イテレータの書き込みアクセス?またはnumpyのジェネレータに値を送る配列
Iは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'
が私の目的の動作を達成するために簡単な解決策はありますか? 何か不足していますか?
EDIT:私が私の実際の問題に関する詳細な情報を提供しなければならないことを、私に指摘されています。上記の例はもちろん簡略化されています。
私はテンソルTをクラスとしてカプセル化したnumpy.ndarray
というリストのリストを持っています。 T:t_ijkl
の要素にアクセスするときは、リストに格納された行列を掛ける必要があります。A(i)*B(j)*C(k)*D(l)
、最初と最後は行/列ベクトルです。
したがって、それぞれのアプリケーションのグリッドポイントに属するA、Bのセットなどがあります。
これで、各グリッドポイントに関連付けられている行列に対するすべてのグリッドポイントとイテレータに対してイテレータを使用したいと考えました。
最初のアイデアは、イテレータのC++スタイルを使用して行列を読み書きすることでした。しかし、agfが下で指摘したように、これは実際に実現可能なアプローチではありません。そこで私は、読み込みアクセスと、特殊なセッターメソッドのためだけに、異なるイテレーターを使用して行列の新しい値を設定することにします。
あなたがしようとしていることが良い方法であるかどうかはわかりません。おそらく、あなたが必要とするものを達成するためのよりよい方法があります。あなたの入力配列と望ましい出力の例を教えてください。 –
私はどちらか分かりません。D クラス全体が、テンソルの分解スキームの一種である行列積状態を表します。テンソルの各要素は、関連する行列の積として表されます。例えば、テンソル3の場合、element_ijkにアクセスしたいのですが、実際にt_ijk = A(i)* A(j)* A(k)を実行します。各インデックスi、j、k ...は格子上の物理的インデックスに属し、A行列はnp.ndarrayのリストのリストに格納される。実際には2つのことが必要なのです... –
...まず、個々の物理グリッドポイント上の行列のセットを繰り返していきたいと思います。そして、第二に、特定のサイトの個々のマトリックスを個別に繰り返していきたいと思います。 –