以下のような 2D 配列があるとします。
array([3, 6, 7
1,-1, 3])
x
、y
および配列の3つの別々の配列を取得したいと思いますvalue
。言い換えると:
x = [0, 1, 0, 1, 0, 1]
y = [0, 0, 1, 1, 2, 2]
values = [3, 1, 6, -1, 7, 3]
これどうやってするの?
参考までに、これは MATLAB が線形インデックス付けと呼んでいるものです。
以下のような 2D 配列があるとします。
array([3, 6, 7
1,-1, 3])
x
、y
および配列の3つの別々の配列を取得したいと思いますvalue
。言い換えると:
x = [0, 1, 0, 1, 0, 1]
y = [0, 0, 1, 1, 2, 2]
values = [3, 1, 6, -1, 7, 3]
これどうやってするの?
参考までに、これは MATLAB が線形インデックス付けと呼んでいるものです。
次のようなものはどうですか:
x, y = np.indices(array.shape)
x = x.ravel(order='F')
y = y.ravel(order='F')
values = array.ravel(order='F')
scipy
と一緒にインストールした場合numpy
は、そのsparse
モジュールを使用できます
from scipy import sparse
x = np.array([[3,6,7],[1,-1,3]])
M=sparse.coo_matrix(x.T)
M.data
# array([ 3, 1, 6, -1, 7, 3])
M.col
# array([0, 1, 0, 1, 0, 1])
M.row
# array([0, 0, 1, 1, 2, 2])
見ると、インデックスを取得するために使用されていることがcoo_matrix
わかります。nonzero()
row,col = x.T.nonzero()
data = x.T[row,col]
にゼロがある可能性がある場合はx
、 のような回避策を使用する必要がありますnp.nonzero(np.ones(x.T.shape))
。
これはどうですか:
import numpy as np
a = np.array([[3, 6, 7],
[1,-1, 3]])
n_rows, n_cols = a.shape
temp_x = np.repeat(np.arange(n_rows)[np.newaxis, :], n_cols, axis=0)
# construction of x can probably be simplified
x = temp_x.ravel()
y = np.repeat(np.arange(n_cols), n_rows)
values = a.ravel(order='F')
結果:
>>> x
array([0, 1, 0, 1, 0, 1])
>>> y
array([0, 0, 1, 1, 2, 2])
>>> values
array([ 3, 1, 6, -1, 7, 3])
配列は、2D 配列 (マトリックス) の方法を使用values
して取得できます。flatten
次に、適切なインデックスを含むようにx
およびy
配列を作成するだけです。
import numpy as np
import itertools
a = np.array([[3, 6, 7],
[1,-1, 3]])
idxs = np.array(list(itertools.product(*map(range, a.shape))))
x = idxs[:,0]
y = idxs[:,1]
values = a.flatten()
これをテストする:
>>> x
array([0, 0, 0, 1, 1, 1])
>>> y
array([0, 1, 2, 0, 1, 2])
>>> values
array([ 3, 6, 7, 1, -1, 3])
>>> a[0,0]
3
>>> a[0,1]
6
>>> a[0,2]
7
>>> a[1,0]
1
>>> a[1,1]
-1
>>> a[1,2]
3