2つのnumpy.ndarrayから直積なnumpy.ndarrayを作る

How to concatenate two numpy array a, b like this – StackOverflow

エレガント.

a = np.array([[1,1],[2,2]])
b = np.array([[3,3], [4,4]])
np.concatenate([np.repeat(a, len(b), axis=0), np.repeat(b[None], len(a), axis=0).reshape(-1, b.shape[1])], axis=1)

array([[1, 1, 3, 3],
[1, 1, 4, 4],
[2, 2, 3, 3],
[2, 2, 4, 4]])

 
 

追記:

Numpyで、2つのArrayから直積でArrayを作る – murnana’s diary

numpy.repeat(numpy.ndarray.repeat)は効率的な関数(メソッド)なので,
時間効率という意味では悪くないんだけど,みての通り分かり難い.

import numpy as np


a = np.arange(0, 1.1, 0.5)
np.concatenate((a[:, None].repeat(len(a),0), a[None, :, None].repeat(len(a), 0).reshape(-1, 1)), 1)
array([[0. , 0. ],
       [0. , 0.5],
       [0. , 1. ],
       [0.5, 0. ],
       [0.5, 0.5],
       [0.5, 1. ],
       [1. , 0. ],
       [1. , 0.5],
       [1. , 1. ]])

numpy.ndarrayでCartesian product(直積)を求めたい場合,
「sklearn.utils.extmath.cartesian」がリーズナブル.

from sklearn.utils.extmath import cartesian


cartesian((a, a))
array([[0. , 0. ],
       [0. , 0.5],
       [0. , 1. ],
       [0.5, 0. ],
       [0.5, 0.5],
       [0.5, 1. ],
       [1. , 0. ],
       [1. , 0.5],
       [1. , 1. ]])
a = np.arange(0, 1.1, 0.5)
%timeit cartesian((a, a))
%timeit np.concatenate((a[:, None].repeat(len(a),0), a[None, :, None].repeat(len(a), 0).reshape(-1, 1)), 1)
a = np.arange(0, 1001, 0.5)
%timeit cartesian((a, a))
%timeit np.concatenate((a[:, None].repeat(len(a),0), a[None, :, None].repeat(len(a), 0).reshape(-1, 1)), 1)
100000 loops, best of 3: 12.9 µs per loop
100000 loops, best of 3: 3.39 µs per loop
10 loops, best of 3: 53.7 ms per loop
10 loops, best of 3: 47.5 ms per loop

 
 

関連:
Numpyで直積(デカルト積,Cartesian Product),順列(permutations),組み合わせ(combinations)

カテゴリー: 未分類 パーマリンク