多维numpy数组的整数索引

6

我很确定在整数索引方面我漏掉了什么,需要一些帮助。假设我创建了一个二维数组:

>>> import numpy as np
>>> x=np.array(range(24)).reshape((4,6))
>>> x
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23]])

我可以使用以下方法选择第1行和第2行:

>>> x[[1,2],:]
array([[ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17]])

或者使用以下方式选定第二行和第三行的第一列:

>>> x[[1,2],1]
array([ 7, 13])

因此,我认为我可以使用以下方式选择第1行和第2行的第3、4和5列:

>>> x[[1,2],[3,4,5]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shape mismatch: objects cannot be broadcast to a single shape

相反,我需要分两步完成:

>>> a=x[[1,2],:]
>>> a
array([[ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17]])
>>> a[:,[3,4,5]]
array([[ 9, 10, 11],
       [15, 16, 17]])

从R语言来的我,我的期望可能是错误的。你能否确认这确实不可能一步完成,或者提供更好的替代方案?谢谢!

编辑:请注意,我在示例中选定的行和列恰巧是连续的,但它们不必连续。换句话说,切片索引对我的情况不起作用。

2个回答

5
您还可以选择在索引数组之间使用广播,这是我通常会做的,而不是两次索引,这会创建您数据的中间副本:
>>> x[[[1], [2]],[[3, 4, 5]]]
array([[ 9, 10, 11],
       [15, 16, 17]])

为了更清楚地了解发生的情况以及如何处理更多的指数,需要做以下调整:
>>> row_idx = np.array([1, 2])
>>> col_idx = np.array([3, 4, 5])
>>> x[row_idx.reshape(-1, 1), col_idx]
array([[ 9, 10, 11],
       [15, 16, 17]])

没错,那个中间副本真的让我很烦。非常感谢! - Miquel
很好;我不知道这个! - Eelco Hoogendoorn

2

类似这样:

In [28]: x[1:3, 3:6]                                                                             
Out[28]: 
array([[ 9, 10, 11],
       [15, 16, 17]])

谢谢!我需要使用索引数组而不是切片进行索引。换句话说,行和列可能不是连续的或有序的。 - Miquel
1
@Miquel 我认为不可能以那种方式对多维数组进行索引。请阅读:http://docs.scipy.org/doc/numpy/user/basics.indexing.html#indexing-multi-dimensional-arrays - Ashwini Chaudhary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接