2

say I have a (3,3,3) array like this.

array([[[1, 1, 1],
        [1, 1, 1],
        [0, 0, 0]],

       [[2, 2, 2],
        [2, 2, 2],
        [2, 2, 2]],

       [[3, 3, 3],
        [3, 3, 3],
        [1, 1, 1]]])

How do I get the 9 values corresponding to euclidean distance between each vector of 3 values and the zeroth values?

Such as doing a numpy.linalg.norm([1,1,1] - [1,1,1]) 2 times, and then doing norm([0,0,0] - [0,0,0]), and then norm([2,2,2] - [1,1,1]) 2 times, norm([2,2,2] - [0,0,0]), then norm([3,3,3] - [1,1,1]) 2 times, and finally norm([1,1,1] - [0,0,0]).

Any good ways to vectorize this? I want to store the distances in a (3,3,1) matrix.

The result would be:

array([[[0. ],
        [0. ],
        [0. ]],

       [[1.73],
        [1.73],
        [3.46]]

       [[3.46],
        [3.46],
        [1.73]]])
4

3 に答える 3

2

keepdimsnumpy 1.7 で引数が追加されました。これを使用して合計軸を保持できます。

np.sum((x - [1, 1, 1])**2, axis=-1, keepdims=True)**0.5

結果は次のとおりです。

[[[ 0.        ]
  [ 0.        ]
  [ 0.        ]]

 [[ 1.73205081]
  [ 1.73205081]
  [ 1.73205081]]

 [[ 3.46410162]
  [ 3.46410162]
  [ 0.        ]]]

編集

np.sum((x - x[0])**2, axis=-1, keepdims=True)**0.5

結果は次のとおりです。

array([[[ 0.        ],
        [ 0.        ],
        [ 0.        ]],

       [[ 1.73205081],
        [ 1.73205081],
        [ 3.46410162]],

       [[ 3.46410162],
        [ 3.46410162],
        [ 1.73205081]]])
于 2013-05-10T07:35:42.840 に答える
0

私は、ビデオ ボリューム内のフレームの各ペアの距離の二乗和 (SSD) を計算するという、似たようなことをしています。お役に立てればと思います。

video_volume は、単一の 4d numpy 配列です。この配列には、次元 (時間、行、列、3) と dtype np.uint8 が必要です。

出力は、dtype float の正方形の 2d numpy 配列です。output[i,j] には、フレーム i と j の間の SSD が含まれている必要があります。

video_volume = video_volume.astype(float)
size_t = video_volume.shape[0]
output = np.zeros((size_t, size_t), dtype = np.float)
for i in range(size_t):
    for j in range(size_t):
        output[i, j] = np.square(video_volume[i,:,:,:] - video_volume[j,:,:,:]).sum()
于 2013-05-10T10:35:33.853 に答える