从 nd 点列表中获取 Numpy ndarray 值

Get Numpy ndarray value from list of nd points

如何尽可能高效地从包含 n 维点坐标的列表中获取 ndarray 的值。

这里是 3D 的实现:

1    arr = np.array([[[0, 1]]])
2    points = [[0, 0, 1], [0, 0, 0]]
3    values = []
4    for point in points:
5        x, y, z = point
6        value.append(arr[x, y, z])
7     # values -> [1, 0]

如果这不可能,有没有办法将第 5-6 行概括为 nD?

我相信有办法使用花哨的索引来实现这一点。这是一种不用 for-loop:

的方法
arr = np.array([[[0, 1]]])
points = np.array([[0, 0, 1], [0, 0, 0]])
x,y,z = np.split(points, 3, axis=1)
arr[x,y,z]

输出(值):

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

或者,您可以按照评论的建议使用元组解包:

arr[(*points.T,)]

输出:

array([1, 0])

基于Numpy documentation for indexing,你可以轻松做到这一点,只要你使用元组而不是列表:

arr = np.array([[[0, 1]]])
points = [(0, 0, 1), (0, 0, 0)]
values = []
for point in points:
    value.append(arr[point])

# values -> [1, 0]

这与所涉及的 Numpy 数组的维数无关。

好处:除了附加到列表之外,您还可以使用 Python slice 函数直接提取范围:

arr = np.array([[[0, 1]]])
points = (0, 0, slice(2) )

vals = arr[points]
# --> [0 1] (a Numpy array!)