如何在Python中从ndarray选择n个项目并跳过m个?
假设我有一个包含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])