軌跡にはパンくずを

戻れるように置くのです

2次元配列の複数の部分を別の2次元配列の同じ位置に代入したい[Numpy]

備忘録

結論から言うと、Numpyのix_関数を使えばできる。

numpy.ix_ — NumPy v1.16 Manual

求める条件

  • 単純なスライスでは対応できない飛び飛びの位置でも可能
  • Pythonのfor文は出来るだけ避けたい

前提条件

  • 代入したい行と列のインデックスをリストで持っている
# 例
>>> row_idx = [1, 2]
>>> column_idx = [0, 1]

この例だと (1, 0), (1, 1), (2, 0), (2, 1) の位置にある値をどうにかして別の配列の同じ位置に代入したいということ。

確認用に3×3の配列を作っておく。

>>> import numpy as np

>>> before_arr = np.arange(1, 10).reshape(3, 3)
>>> before_arr
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> after_arr = np.zeros_like(before_arr)
>>> after_arr
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

イメージとしてはこんな感じ。

f:id:puman03:20190322121930p:plain
3×3の配列の特定の部分を別の配列に代入するときのイメージ

idxの太字(row_idxとcolumn_idx)の位置から同じ位置の灰色部分にそれぞれ代入したい。

解決案

Numpyのix_関数を使えばいいらしい。

>>> ixgrid = np.ix_(row_idx, column_idx)
>>> ixgrid
(array([[1],
        [2]]), array([[0, 1]]))
>>> after_arr[ixgrid] = before_arr[ixgrid]
>>> after_arr
array([[0, 0, 0],
       [4, 5, 0],
       [7, 8, 0]])