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

时间:2017-05-29 15:41:30

标签: python arrays numpy multidimensional-array matrix-indexing

我有一个像这样的指数列表:

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]

如果我在这个循环中打印索引和值,我会得到正确的格式,但是如果我在循环之后打印矩阵,那么值似乎已经多次放在那里而不是仅放在指定的索引上。我做错了什么?

1 个答案:

答案 0 :(得分:4)

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

brain_map[ind_x,ind_y,ind_z] = vals

其中ind_x, ind_y, ind_zvals都是相同长度的1d数组。你拥有的基本上是索引数组的转置:

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)