我正在使用算法来匹配两种对象(比方说balls
和buckets
)。每个对象都被建模为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
答案 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