使用1d布尔索引从2d数组中选择

时间:2018-04-08 13:55:01

标签: python arrays numpy

有时我会有一个res.send(Buffer)数组,我需要从中选择数据,但数据标准只有ND个维度。举个例子

M < N

现在,我想做

## generate some matrix
test = np.arange(9).reshape((3, 3))
## some condition based on first-dimension only
selectMe = np.array([ True,  True, False], dtype=bool)

但这会导致IndexError:

test[selectMe[:, None]]

当然,如果我在第二维上重复布尔索引,一切正常 - 以下是预期的输出:

IndexError: boolean index did not match indexed array along dimension 1; dimension is 3 but corresponding boolean dimension is 1

然而,这是非常低效的。使用test[np.repeat(selectMe[:, None], 3, axis=1)] Out[41]: array([0, 1, 2, 3, 4, 5]) 而不必重复矩阵的自然方式是什么?

1 个答案:

答案 0 :(得分:2)

如果我了解您的问题,您可以使用省略号(...)来涵盖未经过滤的维度:

import numpy as np

test = np.arange(10000).reshape((100, 100))

# condition
selectMe = np.random.randint(0, 2, 100).astype(bool)

assert (test[selectMe, ...].ravel() == test[np.repeat(selectMe[:, None], 100, axis=1)]).all()

%timeit test[selectMe, ...].ravel()                       # 11.6 µs
%timeit test[np.repeat(selectMe[:, None], 100, axis=1)]   # 103 µs