我有一个像这样的指数列表:
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]
如果我在这个循环中打印索引和值,我会得到正确的格式,但是如果我在循环之后打印矩阵,那么值似乎已经多次放在那里而不是仅放在指定的索引上。我做错了什么?
答案 0 :(得分:4)
你应该尽可能避免在numpy数组上循环,否则你会失去性能。您可以使用advanced ("fancy") indexing来索引特定索引处的元素子集。这可以这样工作:
brain_map[ind_x,ind_y,ind_z] = vals
其中ind_x, ind_y, ind_z
和vals
都是相同长度的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)