我需要按数组中的列索引从矩阵中获取值。我的代码有效,但是我似乎需要创建虚拟数组似乎很奇怪。
编辑:分数是500x10的矩阵,y是从0到9的500个索引的列表。我必须选择与y相对应的500个值。
# scores: 2D matrix
# y: array of indices
dummy_array = range(scores.shape[0])
scores[range(dummy_array), y]
答案 0 :(得分:1)
在相关问题中:
How to index a ndarray with another ndarray?
a = np.arange(50).reshape(10, 5) # Array to be indexed
b = np.arange(9, -1, -2) # Indexing array
通过以下操作从每一列中选择一项:
In [252]: a[b, np.arange(5)]
Out[252]: array([45, 36, 27, 18, 9])
在MATLAB中类似的操作需要How to select one element from each column of a matrix in matlab?,一个sub2ind
函数,该函数unravels
索引,产生一个平面列表:
a(sub2ind(size(a), b, 1:length(b)))
numpy
具有类似的功能,在1d展平(或散乱)数据缓冲区中构造索引:
In [253]: np.ravel_multi_index((b, np.arange(5)), a.shape)
Out[253]: array([45, 36, 27, 18, 9])
In [254]: a.flat[_]
Out[254]: array([45, 36, 27, 18, 9])
这些Out[253]
数字的计算方法如下:
In [256]: b*5 + np.arange(5)
Out[256]: array([45, 36, 27, 18, 9])
因此,无论我们提供的是np.arange(5)
还是仅提供5,还是从a.shape
推导得出,都需要使用值来得出平坦索引。隐藏该步骤不会节省您的时间或内存。
请注意,这些值的顺序不是规则的,因此不能以切片表示。在更一般的情况下,我们只是选择随机散布在数组a
周围的点。它们不必每行(或每列)一个,也可以不行。
在情人眼中,简洁就在眼前。对我来说,用
索引的想法a[x, y]
其中x
和y
可以是可广播的任何数组都很简单。
答案 1 :(得分:0)
您可以使用列表理解:
l = [j[y[i]] for i, j in enumerate(scores)]
l
是您的500个长度列表。
但评论中所说的numpy.arange()
也有效。