【发布时间】:2018-02-20 06:21:33
【问题描述】:
当处理维度为 (A, B, C) 的 3 维矩阵“M”时,可以使用 2 个向量 X 索引 M,其中元素在 [0, A) 中,Y 中元素在 [0, B) 中同维D。
更具体地说,我在写作时明白这一点
M[X,Y,:]
对于 D 中的每个“i”,我们正在取
M[X[i], Y[i], :],
从而最终生成一个 DxC 矩阵。
现在假设
X is a numpy array of dim U, same concept as before
this time Y is a matrix UxL, where each row correspond to a Boolean numpy array
(a mask)
看看下面的代码
for u in U:
my_matrix[Y[u], X[u], :] += 1 # Y[u] is the mask that selects specific elements of the first dimension
我想编写没有 for 循环的相同代码。类似这样的东西
np.add.at(my_matrix, (Y, X), 1) # i use numpy.ufunc.at since same elements could occur multiple times in X or Y.
不幸的是返回以下错误
IndexError: 布尔索引与第 0 维的索引数组不匹配;维度是 L 但对应的布尔维度是 1
执行分配时也会发现此问题
for u in U:
a_matrix[u, Y[u], :] = my_matrix[Y[u], X[u], :]
你知道我可以如何优雅地解决这个问题吗?
【问题讨论】:
-
您能否举一个最小的工作示例,可能是 3x3x2 矩阵或易于可视化的东西?
-
为了确保我理解,
Y是一个二维矩阵,Y[u]是索引Y维度的一维掩码。但是X是一维矩阵,所以X[u]是单个元素。换句话说,在工作 for 循环中,每次仅在所有三个维度中Y指示的行处将 1 添加到单个列。所以Y[u]可能表示一些相同的行,这对应于将 1 多次添加到这些元素。对吗? -
如果是这样,我认为最好的方法是先折叠
Y向量,然后计算一个求和矩阵以添加到整个事物中。 -
@AlexanderReynolds 正确。我已经用进一步的分配问题更新了这个问题,
标签: python arrays numpy matrix indexing