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)
ピンバック: Numpyで直積(デカルト積,Cartesian Product),順列(permutations),組み合わせ(combinations) | 粉末@それは風のように (日記)
ピンバック: numpyで効率的に直積(デカルト積,Cartesian)な配列を得る方法 | 粉末@それは風のように (日記)