有没有更优雅的方法来按2D数组中的索引取值?

时间:2019-01-30 22:37:53

标签: python numpy

我需要按数组中的列索引从矩阵中获取值。我的代码有效,但是我似乎需要创建虚拟数组似乎很奇怪。

编辑:分数是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]

2 个答案:

答案 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]

其中xy可以是可广播的任何数组都很简单。

答案 1 :(得分:0)

您可以使用列表理解:

l = [j[y[i]] for i, j in enumerate(scores)]

l是您的500个长度列表。

但评论中所说的numpy.arange()也有效。