あなたはこれを試すことができます:
>>> import numpy as np
>>> class A:
... def __init__(self, values):
... self.partposit = values
...
>>> PARTS = dict((index, A(np.zeros((50000, 12)))) for index in xrange(163))
>>> p1 = np.dstack((PARTS[k].partposit for k in sorted(PARTS.keys())))
>>> p1.shape
(50000, 12, 163)
>>>
私のマシンにスタックするのに数秒かかりました。
>>> import timeit
>>> timeit.Timer('p1 = np.dstack((PARTS[k].partposit for k in sorted(PARTS.keys())))', "from __main__ import np, PARTS").timeit(number = 1)
2.1245520114898682
numpy.dstack
配列のシーケンスを取り込んでスタックするので、自分で連続的にスタックするのではなく、リストを指定するだけの方がはるかに高速です。
numpy.dstack(tup)
配列を深さ方向に(3番目の軸に沿って)スタックします。一連の配列を取得し、それらを3番目の軸に沿ってスタックして、単一の配列を作成します。
http://docs.scipy.org/doc/numpy/reference/generated/numpy.dstack.html
私はまた、あなたの方法がどれくらいの長さになるかについても興味がありました:
>>> import timeit
>>> setup = """
... import numpy as np
... #PARTS is my dictionary
... #the .partposit is the attribute that is an array of shape (50000, 12)
...
... class A:
... def __init__(self, values):
... self.partposit = values
...
... PARTS = dict((index, A(np.zeros((50000, 12)))) for index in xrange(163))
... ks = sorted(PARTS.keys())
... """
>>> stack = """
... p1 = PARTS[ks[0]].partposit
... for k in ks[1:]:
... p1 = np.dstack((p1, PARTS[k].partposit))
... """
>>> timeit.Timer(stack, setup).timeit(number = 1)
67.69684886932373
痛い!
>>> numpy.__version__
'1.6.1'
$ python --version
Python 2.6.1
これがお役に立てば幸いです。