【发布时间】:2020-03-22 04:04:45
【问题描述】:
假设我想为每一行从不同的列中选择一个值。然后,我可能会这样做:
a = np.arange(12).reshape(3, 4)
columns = np.array([1, 2, 0])
a[np.arange(a.shape[0]), columns]
在我看来,需要指定整个范围有点“难看”;此外,即使是arange 调用也需要时间:
%timeit np.arange(int(1e6))
1.03 ms ± 15.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
有没有办法避免使用 arange?
概括上述问题;如何不选择单个值,而是为每一行选择不同的相邻列集(每组大小相同)?我想避免创建许多手动范围,如下所示:
rows = np.array([0, 2])
start_values = np.array([0, 1])
window_length = 3
column_ranges = np.array(list(map(lambda j: np.arange(j, j + window_length), start_values)))
现在,我看到使用上述列范围的唯一方法是像这样索引:
a[rows, :][:, column_ranges][np.arange(len(rows)), np.arange(len(rows)), :]
理想情况下,我想使用a[:, columns] 代替a[np.arange(a.shape[0]), columns] 和a[:, columns:columns + window_length] 代替a[rows, :][:, column_ranges][np.arange(len(rows)), np.arange(len(rows)), :] 之类的符号。
【问题讨论】:
-
a[:, columns]应该可以吗? -
a[:, columns]用于选择矩阵的整个列,而我想为每一行选择不同的列。 -
在首先描述的更简单的情况下,它只涉及单个值,因此在这种情况下,这不是问题。在我后面描述的更一般的情况下,它涉及长度相等的集合,所以这又不是问题。我会澄清措辞。
标签: python numpy numpy-ndarray numpy-slicing