直積

0

これは、私は、任意の次元を持つ2つの配列のデカルト積を作成するための簡潔な方法を探していNumpy: cartesian product of x and y array points into single array of 2D points直積

に幾分関連しています。

例:

、関連スレッドと同様に、私は結果の配列が2次元である

x = numpy.array([1,2,3]) #ndim 1 
y = numpy.array([4,5]) #ndim 1 
cartesian_product(x,y) == numpy.array([[[1, 4], 
             [2, 4], 
             [3, 4]], 
             [[1, 5], 
             [2, 5], 
             [3, 5]]]) #ndim "2" = ndim x + ndim y 

たい故に[1,4]、[2,4]、などである座標となぜなら真の次元ではありません。一般化するには、x/yを[[1]、[2]、[3]]と書く方が良いでしょう。

上記は

numpy.dstack(numpy.meshgrid(x,y)) 

に等しい。しかし、私はまた

x2 = numpy.array([[1,1], [2,2], [3,3]]) #ndim "1", since [1, 1] is a coordinate 
cartesian_product(x2,y) == numpy.array([[[1, 1, 4], 
             [2, 2, 4], 
             [3, 3, 4]], 

             [[1, 1, 5], 
             [2, 2, 5], 
             [3, 3, 5]]]) #ndim 2 = ndim x2 + ndim y 


y2 = numpy.array([[10, 11], [20, 21]]) #ndim 1 
(cartesian_product(x2, y2) == 
numpy.array([[[1, 1, 10, 11], 
       [2, 2, 10, 11], 
       [3, 3, 10, 11]], 

      [[1, 1, 20, 21], 
       [2, 2, 20, 21], 
       [3, 3, 20, 21]]])) #ndim x2 + ndim y2 

x3 = numpy.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) #ndim 2 
(cartesian_product(x3, y) == 
numpy.array([[[[1, 2, 4], [3, 4, 4]], [[5, 6, 4], [7, 8, 4]]], 
      [[[1, 2, 5], [3, 4, 5]], [[5, 6, 5], [7, 8, 5]]]]) #ndim 3 

は私が何をしようとしている視覚化したい: 私が言ったように、[[0、0]、[ 0,1]、[1,1]、[1,0]]は、線に対応する1次元の座標リストとして解釈されるべきである。 [1、2、3、4]でデカルト積を行うと、この線をz方向に押し出して面(2次元)にします。しかし今、アレイはもちろん3次元です。

私はこれをループで解決することができますが、numpy/scipyツールでこれを達成する方法はありますか?

+0

「座標」の意味を理解できません。最初の例の結果配列は3次元です。 numpyに入力すると、ndim 3になります。同様に、すべての例x2、y2、x3は、あなたが思うよりも多くの次元を持っています。 – BrenBarn

+0

もちろん[[1,1]、[2,2]]は2次元配列です。しかし、私が探しているデカルト積関数では、座標のリスト[coord1、coord2]なので、本質的に1次元です。その配列が2 + 1次元であっても[[coord11、coord12]、[coord21、coord22]]は "2"次元になります。 問題を説明しようとすると、xyで定義された曲線があり、座標のリストになりますが、線は本質的に1次元であるとしましょう。私がしようとしていることは、それを別の次元で押し出すことです。 – mueslo

答えて

1

メモリの効率的な方法が割り当て放送されています。あなたは、放送の詳細を必要とする場合には

def cartesian_product(x, y): 
    if x.ndim < 2: 
     x = np.atleast_2d(x).T 
    if y.ndim < 2: 
     y = np.atleast_2d(y).T 

    sx, sy = x.shape, y.shape 
    sz = sy[:-1] + sx[:-1] + (sy[-1] + sx[-1],) 
    z = np.empty(sz, np.result_type(x, y)) 

    # Broadcasted assignment 
    z[...,:sx[-1]] = x 
    z[...,sx[-1]:] = y.reshape(sy[:-1] + (x.ndim-1)*(1,) + (sy[-1],)) 

    return z 

this pageあなたがカバーしています。

関連する問題