我想选择 numpy 数组中的每 n 组 n 列。这意味着我想要前 n 列,而不是接下来的 n 列,接下来的 n 列,而不是接下来的 n 列等等。
例如,使用以下数组和 n=2
:
import numpy as np
arr = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15, 16, 17, 18, 19, 20]])
我想得到:
[[1, 2, 5, 6, 9, 10],
[11, 12, 15, 16, 19, 20]]
并与 n=3
:
[[1, 2, 3, 7, 8, 9],
[11, 12, 13, 17, 18, 19]]
与n=1
我们可以简单地使用语法arr[:,::2]
,但是 n>1
有类似的东西吗? ?
最佳答案
您可以使用modulus
创建从 0
开始直到 2n
的渐变,然后从每个此类渐变中选择第一个 n
。因此,对于每个斜坡,我们首先将 n
设置为 True
,其余设置为 False
,从而为我们提供一个涵盖整个长度的 bool 数组数组。然后,我们只需使用 boolean indexing
沿着列选择最终输出的有效列。因此,实现看起来像这样 -
arr[:,np.mod(np.arange(arr.shape[-1]),2*n)<n]
逐步运行代码以提供更好的想法 -
In [43]: arr
Out[43]:
array([[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15, 16, 17, 18, 19, 20]])
In [44]: n = 3
In [45]: np.mod(np.arange(arr.shape[-1]),2*n)
Out[45]: array([0, 1, 2, 3, 4, 5, 0, 1, 2, 3])
In [46]: np.mod(np.arange(arr.shape[-1]),2*n)<n
Out[46]: array([ True,True,True,False,False,False,True,True,True,False])
In [47]: arr[:,np.mod(np.arange(arr.shape[-1]),2*n)<n]
Out[47]:
array([[ 1, 2, 3, 7, 8, 9],
[11, 12, 13, 17, 18, 19]])
示例在各种 n
上运行 -
In [29]: arr
Out[29]:
array([[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15, 16, 17, 18, 19, 20]])
In [30]: n = 1
In [31]: arr[:,np.mod(np.arange(arr.shape[-1]),2*n)<n]
Out[31]:
array([[ 1, 3, 5, 7, 9],
[11, 13, 15, 17, 19]])
In [32]: n = 2
In [33]: arr[:,np.mod(np.arange(arr.shape[-1]),2*n)<n]
Out[33]:
array([[ 1, 2, 5, 6, 9, 10],
[11, 12, 15, 16, 19, 20]])
In [34]: n = 3
In [35]: arr[:,np.mod(np.arange(arr.shape[-1]),2*n)<n]
Out[35]:
array([[ 1, 2, 3, 7, 8, 9],
[11, 12, 13, 17, 18, 19]])
关于python - 选择 n 列的每个交替组 - NumPy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38347664/