gpt4 book ai didi

python - 使用 numpy 获取 3D 空间中所有对象的相对位置

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:54 24 4
gpt4 key购买 nike

我想获得 numpy 数组中向量对的所有排列之间的差异。

在我的特定用例中,这些向量是对象列表的 3D 位置向量。

所以,如果我有一个数组 r = [r1, r2, r3] 其中 r1r2r3 是 3 维向量,我想要以下内容:

[[r1-r1 r1-r2 r1-r3]
[r2-r1 r2-r2 r2-r3]
[r3-r1 r3-r2 r3-r3]]

其中 - 操作按元素应用于向量。

基本上,向量等效于此:

>>> scalars = np.arange(3)
>>> print(scalars)
[0 1 2]

>>> result = np.subtract.outer(scalars, scalars)
>>> print(result)
[[ 0 -1 -2]
[ 1 0 -1]
[ 2 1 0]]

但是,outer 函数似乎在减法之前展平了我的向量数组,然后对其进行了整形。例如:

>>> vectors = np.arange(6).reshape(2, 3) # Two 3-dimensional vectors
>>> print(vectors)
[[0 1 2]
[3 4 5]]

>>> results = np.subtract.outer(vectors, vectors)
>>> print(results.shape)
(2, 3, 2, 3)

我期望的结果是:

>>> print(result)
[[[ 0 0 0]
[-3 -3 -3]]
[[ 3 3 3]
[ 0 0 0]]]

>>> print(result.shape)
(2, 2, 3)

我能否在不遍历数组的情况下实现上述目标?

最佳答案

答案几乎总是broadcasting :

>>> r = np.arange(6).reshape(2, 3)
>>> r[:, None] - r
array([[[ 0, 0, 0],
[-3, -3, -3]],

[[ 3, 3, 3],
[ 0, 0, 0]]])

索引中的 Nonenp.newaxis 相同,并向数组的形状添加一个大小为 1 的维度。因此,您从形状为 (2, 1, 3) 的数组中减去形状为 (2, 3) 的数组,该数组通过广播转换为 ( 1, 2, 3),最终结果就是你想要的(2, 2, 3)数组。虽然广播在概念上类似于使用 np.tilenp.repeat,但它更加高效,因为它避免了创建原始数组的扩展副本。

关于python - 使用 numpy 获取 3D 空间中所有对象的相对位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25460028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com