如何在一行中按多个维度对ndarray
进行切片?检查以下代码段中的最后一行。这看起来很基本,却给人一种惊喜......但为什么呢?
import numpy as np
# create 4 x 3 array
x = np.random.rand(4, 3)
# create row and column filters
rows = np.array([True, False, True, False])
cols = np.array([True, False, True])
print(x[rows, :].shape == (2, 3)) # True ... OK
print(x[:, cols].shape == (4, 2)) # True ... OK
print(x[rows][:, cols].shape == (2, 2)) # True ... OK
print(x[rows, cols].shape == (2, 2)) # False ... WHY???
答案 0 :(得分:4)
由于rows
和cols
是布尔数组,所以:
x[rows, cols]
就像:
x[np.where(rows)[0], np.where(cols)[0]]
是:
x[[0, 2], [0, 2]]
获取位置(0, 0)
和(2, 2)
的值。另一方面,做:
x[rows][:, cols]
的工作方式如下:
x[[0, 2]][:, [0, 2]]
在此示例中返回形状(2, 2)
。