![](/img/trans.png)
[英]More Pythonic / elegant way to fill a 2D array with sequences of integers?
[英]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]
在相关问题中:
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]
x
和y
可以是可广播的任何数组很简单。
您可以使用列表理解:
l = [j[y[i]] for i, j in enumerate(scores)]
l
是您的500个长度清单。
但是注释中所说的numpy.arange()
也可以。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.