索引具有2个索引列表的2D Numpy数组

don*_*lan 20 python arrays numpy

我有一个奇怪的情况.

我有一个2D Numpy数组,x:

x = np.random.random_integers(0,5,(20,8))
Run Code Online (Sandbox Code Playgroud)

我有2个索引器 - 一个带有行的索引,另一个带有索引.为了索引X,我必须执行以下操作:

row_indices = [4,2,18,16,7,19,4]
col_indices = [1,2]
x_rows = x[row_indices,:]
x_indexed = x_rows[:,column_indices]
Run Code Online (Sandbox Code Playgroud)

而不仅仅是:

x_new = x[row_indices,column_indices]
Run Code Online (Sandbox Code Playgroud)

(失败的:错误,无法用(2,)广播(20,))


我希望能够使用广播在一行中进行索引,因为这样可以保持代码的清晰和可读性......而且,我不知道所有关于python的内容,但据我所知它,它应该更快一行(我将使用相当大的数组).


测试用例:

x = np.random.random_integers(0,5,(20,8))

row_indices = [4,2,18,16,7,19,4]
col_indices = [1,2]
x_rows = x[row_indices,:]
x_indexed = x_rows[:,col_indices]

x_doesnt_work = x[row_indices,col_indices]
Run Code Online (Sandbox Code Playgroud)

Div*_*kar 22

你可以简单地np.ix_用于这样的广播工作,就像这样 -

x_indexed = x[np.ix_(row_indices,col_indices)]
Run Code Online (Sandbox Code Playgroud)

样品运行 -

x[np.ix_(row_indices,col_indices)] = # scalar or broadcastable array
Run Code Online (Sandbox Code Playgroud)

由OP建议,这是在相同的效果作为执行老派用的2D阵列版本广播indexing-arrays具有它的元素/索引发送np.ix_并因此产生在一个单维1D和因此允许广播用masks.因此,我们会有一个像这样的替代解决方案 -

x[np.ix_(row_mask,col_mask)]
Run Code Online (Sandbox Code Playgroud)


Jul*_*nck 6

关于什么:

x[row_indices][:,col_indices]
Run Code Online (Sandbox Code Playgroud)

例如,

x = np.random.random_integers(0,5,(5,5))
## array([[4, 3, 2, 5, 0],
##        [0, 3, 1, 4, 2],
##        [4, 2, 0, 0, 3],
##        [4, 5, 5, 5, 0],
##        [1, 1, 5, 0, 2]])

row_indices = [4,2]
col_indices = [1,2]
x[row_indices][:,col_indices]
## array([[1, 5],
##        [2, 0]])
Run Code Online (Sandbox Code Playgroud)

  • 这对于获取来说很好,但对于分配来说却失败了。行索引会生成一个副本。 (3认同)

MSe*_*ert 5

import numpy as np
x = np.random.random_integers(0,5,(4,4))
x
array([[5, 3, 3, 2],
       [4, 3, 0, 0],
       [1, 4, 5, 3],
       [0, 4, 3, 4]])

# This indexes the elements 1,1 and 2,2 and 3,3
indexes = (np.array([1,2,3]),np.array([1,2,3]))
x[indexes]
# returns array([3, 5, 4])
Run Code Online (Sandbox Code Playgroud)

请注意,根据您使用的索引类型,numpy 有非常不同的规则。所以索引多个元素应该由一个tupleof np.ndarray(参见索引手册)。

所以你只需要将你的转换listnp.ndarray,它应该能按预期工作。


Mad*_*ist 5

我认为您正在尝试执行以下(等效)操作之一:

x_does_work = x[row_indices,:][:,col_indices]
x_does_work = x[:,col_indices][row_indices,:]
Run Code Online (Sandbox Code Playgroud)

这实际上将创建x仅包含所选行的子集,然后从中选择列,或者在第二种情况下反之亦然。第一种情况可以被认为是

x_does_work = (x[row_indices,:])[:,col_indices]
Run Code Online (Sandbox Code Playgroud)


Joo*_*ark 4

如果你用 np.newaxis 编写它,你的第一次尝试就会成功

x_new = x[row_indices[:, np.newaxis],column_indices]
Run Code Online (Sandbox Code Playgroud)