将两个2D numpy数组合并为一个包含2元组的单个2D数组

10
我有两个2D的numpy数组,代表三个点之间的x/y距离。我需要将x/y距离作为元组存储在一个单一的数组中。 因此,从:
x_dists = array([[ 0, -1, -2],
                 [ 1,  0, -1],
                 [ 2,  1,  0]])

y_dists = array([[ 0, -1, -2],
                 [ 1,  0, -1],
                 [ 2,  1,  0]])

我需要:

dists = array([[[ 0,  0], [-1, -1], [-2, -2]],
               [[ 1,  1], [ 0,  0], [-1, -1]],
               [[ 2,  2], [ 1,  1], [ 0,  0]]])

我尝试使用dstack/hstack/vstack/concatenate的各种排列组合,但似乎都不能满足我的要求。由于代码中的实际数组可能非常庞大,因此在Python中遍历元素并手动进行重排不是速度上的选择。

编辑: 最终我得出了这个结果:https://gist.github.com/807656


1
x_disty_dist相同只是巧合吗?还有,负距离在你的应用中是什么意思? _dist是否总是“对称”的,但是上三角部分为负?你预计要处理多少个点?这些数组叠放的目的是什么?元素是否以“最优”顺序进行进一步计算?这只是一些想法,谢谢。 - eat
这只是巧合。为了方便起见,示例点为(0, 0),(1, 1),(2, 2)。_dist确实是对称的。将数组堆叠的目的是我可以使用它们来移动点。请参见链接的gist。 - Zarkonnen
2个回答

12
import numpy as np
dists = np.vstack(([x_dists.T], [y_dists.T])).T

返回像您想要的那样的 dists。之后它不再是 "一个由2元组组成的单个2D数组",而是一个正常的3D数组,其中第三个轴是两个原始数组的连接。

你看:

dists.shape # (3, 3, 2)

1
这正是我想要的。我担心我使用“2D 2元组数组”这个术语可能会误导人。:( - Zarkonnen

8
numpy.rec.fromarrays([x_dists, y_dists], names='x,y')

太棒了!这正是我想要的。那么,既然你似乎知道numpy,我编辑的函数计算这些成对距离的方式是否合理? - Zarkonnen
编辑:实际上,这并没有给我一个我知道如何处理的数组。 - Zarkonnen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接