繁体   English   中英

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

[英]Is there a more elegant way to take values by indicies in 2D array?

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

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

在相关问题中:

如何用另一个ndarray索引一个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中,类似的操作要求如何在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.shape ,都需要使用值来得出平坦索引。 隐藏该步骤不会节省您的时间或内存。

请注意,这些值的顺序不是规则的,因此无法以切片表示。 在更一般的情况下,我们只是选择随机散布在数组a周围的点。 它们不必每行(或每列)一个,也可以是几行或一无。

在此情人眼中,简洁。 对我来说索引的想法

a[x, y]

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

您可以使用列表理解:

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

l是您的500个长度清单。

但是注释中所说的numpy.arange()也可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM