如何在Python中从ndarray选择n个项目并跳过m个?

5 投票
5 回答
3368 浏览
提问于 2025-05-10 15:12

假设我有一个包含100个元素的ndarray(就是一种数据结构),我想选择前4个元素,然后跳过6个,再继续这样选下去(换句话说,就是每10个元素中选前4个)。

我试着用Python的切片功能来实现这个,但我觉得在我的情况下不太管用。我该怎么做呢?我在用Pandas和numpy,这两个工具能帮上忙吗?我找了很多地方,但没找到类似的切片方法。谢谢!

相关文章:

  • 暂无相关问题
暂无标签

5 个回答

0

在提问者的例子中,输入的数组可以被 m+n 整除。如果不能整除,你可以使用下面的函数 take_n_skip_m。这个函数是对@Divakar的回答的进一步扩展,它通过在输入数组的两边添加一些元素,使得这个数组可以被重新调整成一个合适的二维矩阵;然后通过切片、扁平化和再次切片来得到想要的结果:

def take_n_skip_m(arr, n=4, m=6):
    # in case len(arr) is not divisible by (n+m), get the remainder
    remainder = len(arr) % (n+m)
    # will pad arr with (n+m-remainder) 0s at the back
    pad_size = (0, n+m-remainder)
    # pad arr; reshape to create 2D array; take first n of each row; flatten 2D->1D
    sliced_arr = np.pad(arr, pad_size).reshape(-1, n+m)[:, :n].flatten()
    # remove any remaining padding constant if there is any (which depends on whether remainder >= n or not)
    return sliced_arr if remainder >= n else sliced_arr[:remainder-n]

例子:

>>> out = take_n_skip_m(np.arange(20), n=5, m=4)
>>> print(out)
[ 0  1  2  3  4  9 10 11 12 13 18 19]

>>> out = take_n_skip_m(np.arange(20), n=5, m=6)
>>> print(out)
[ 0  1  2  3  4 11 12 13 14 15]
1
shorter_arr = arr[np.arange(len(arr))%10 < 4]

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得简单易懂。

1

使用 % 10

print [i for i in range(100) if i % 10 in (0, 1, 2, 3)]

[0, 1, 2, 3, 10, 11, 12, 13, 20, 21, 22, 23, 30, 31, 32, 33, 40, 41, 42, 43, 50, 51, 52, 53, 60, 61, 62, 63, 70, 71, 72, 73, 80, 81, 82, 83, 90, 91, 92, 93]
2

你可以把这个数组变成一个 10x10 的形状,然后用切片的方法来选取每一行的前4个元素。最后,把这个变形并切片后的数组再压平:

In [46]: print a
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99]

In [47]: print a.reshape((10,-1))[:,:4].flatten()
[ 0  1  2  3 10 11 12 13 20 21 22 23 30 31 32 33 40 41 42 43 50 51 52 53 60
 61 62 63 70 71 72 73 80 81 82 83 90 91 92 93]
5

你可以使用 NumPy 切片 来解决你的问题。

对于一个 1D 数组的情况 -

A.reshape(-1,10)[:,:4].reshape(-1)

这可以扩展到 2D 数组的情况,选择是沿着第一个轴进行的 -

A.reshape(-1,10,A.shape[1])[:,:4].reshape(-1,A.shape[1])

撰写回答