填充 3d numpy 数组的某些索引

Fill certain indices of a 3d numpy array

我有一个这样的索引列表:

selected_coords = [[1, 8, 30], [15, 4, 6] ,...]

以及像这样的值列表:

differences = [1, 5, 8, 2, ...]

两者都有 500 个条目。现在我想用这些值在正确的索引上填充一个 3d numpy 数组。我尝试做的是以下内容:

brain_map = np.zeros(shape=(48,60,22))

for i, index in enumerate(selected_coords):
    ind = list(map(int, index))
    brain_map[ind] = differences[i]

如果我在这个循环中打印索引和值,我得到正确的格式,但如果我在循环后打印矩阵,看起来这些值已经被多次放入其中,而不是只放在指定的索引上.我做错了什么?

您应该尽可能避免在 numpy 数组上循环,否则您会失去性能。您可以使用 advanced ("fancy") indexing 来索引特定索引处的元素子集。这会像这样工作:

brain_map[ind_x, ind_y, ind_z] = vals

其中 ind_x, ind_y, ind_zvals 都是相同长度的一维数组。您所拥有的本质上是索引数组的转置:

brain_map[tuple(zip(*selected_coords))] = differences

zip(*) 技巧本质上是转置您的列表列表,然后可以将其作为元组传递以进行索引。例如:

>>> import numpy as np
>>> M = np.random.rand(2, 3, 4)
>>> coords = [[0, 1, 2], [1, 2, 3]]
>>> tuple(zip(*coords))
((0, 1), (1, 2), (2, 3))
>>> M[tuple(zip(*coords))]
array([ 0.12299864,  0.76461622])
>>> M[0, 1, 2], M[1, 2, 3]
(0.12299863762892316, 0.76461622348724623)