次のようなリストのリストで構成されるマトリックスがあるとします。
>>> LoL=[list(range(10)) for i in range(10)]
>>> LoL
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
また、同じ構造のnumpy行列が次のように呼ばれていると仮定しLoLa
ます。
>>> LoLa=np.array(LoL)
numpyを使用すると、次のようにこの行列の部分行列を取得できます。
>>> LoLa[1:4,2:5]
array([[2, 3, 4],
[2, 3, 4],
[2, 3, 4]])
次のように、純粋なPythonでnumpyマトリックススライスを複製できます。
>>> r=(1,4)
>>> s=(2,5)
>>> [LoL[i][s[0]:s[1]] for i in range(len(LoL))][r[0]:r[1]]
[[2, 3, 4], [2, 3, 4], [2, 3, 4]]
これは、世界で最も読みやすいものでも、最も効率的なものでもありません:-)
質問:(純粋なPythonで)任意の行列をサブ行列としてスライスする簡単な方法はありますか?