使用3d numpy数组进行矢量化操作

时间:2017-09-20 13:18:46

标签: python arrays numpy

我正在使用算法来匹配两种对象(比方说ballsbuckets)。每个对象都被建模为4D numpy数组,每种对象都在另一个数组中。我的方法是基于计算每对(ball, bucket)之间的所有可能差异并对该差异应用相似度函数。

我试图避免for循环,因为速度与我正在做的事情非常相关,所以我通过重塑其中一个初始数组创建这些差异,广播numpy操作和创建3D numpy数组(diff_map)。我没有找到任何关于此的好教程,所以我想知道是否有更多的正确方法"要做到这一点。如果可能,我也希望看到关于这种操作(多维重塑和广播)的任何好的参考。

我的代码:

import numpy as np

balls = np.random.rand(3,4)
buckets = np.random.rand(6,4)
buckets = buckets.reshape(len(buckets), 1, 4)
buckets
array([[[ 0.38382622,  0.27114067,  0.63856317,  0.51360638]],

   [[ 0.08709269,  0.21659216,  0.31148519,  0.99143705]],

   [[ 0.03659845,  0.78305241,  0.87699971,  0.78447545]],

   [[ 0.11652137,  0.49490129,  0.76382286,  0.90313785]],

   [[ 0.62681395,  0.10125169,  0.61131263,  0.15643676]],

   [[ 0.97072113,  0.56535597,  0.39471204,  0.24798229]]])

diff_map = balls-buckets
diff_map.shape
(6, 3, 4)

For Loop

根据要求,这是我试图避免的for循环:

diff_map_for = np.zeros((len(buckets), len(balls), 4))
for i in range(len(buckets)):
    for j in range(len(balls)):
        diff_map_for[i, j] = buckets[i]-balls[j]

`只是为了确定,让我们比较两个结果:

np.all(diff_map == diff_map_for)
True

1 个答案:

答案 0 :(得分:0)

这对你有用吗?

import numpy as np

balls = np.random.rand(3,4)
buckets = np.random.rand(6,4)

diff_map = buckets[:, np.newaxis, :] - balls[np.newaxis, :, :]
print(diff_map.shape)
# output: (6, 3, 4)

# ... compared to for loop
diff_map_for = np.zeros((len(buckets), len(balls), 4))
for i in range(len(buckets)):
    for j in range(len(balls)):
        diff_map_for[i, j] = buckets[i] - balls[j]

print(np.sum(diff_map - diff_map_for))
# output: 0.0