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)
关于什么:
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)
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(参见索引手册)。
所以你只需要将你的转换list为np.ndarray,它应该能按预期工作。
我认为您正在尝试执行以下(等效)操作之一:
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)
如果你用 np.newaxis 编写它,你的第一次尝试就会成功
x_new = x[row_indices[:, np.newaxis],column_indices]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8387 次 |
| 最近记录: |