如何在Python中使用间隔索引数组的多个项

如何在Python中使用间隔索引数组的多个项,python,arrays,numpy,Python,Arrays,Numpy,假设我有一个列表: import numpy as np a = [2, 4, 6, 8, ..., 1000] # total 500 elements b = np.array(a) # numpy version 我想得到第1到第100个、第201到第300个、第401到第500个元素,并将它们组成一个新阵列 为此,我尝试了以下代码: a_sub = a[0:100] + a[200:300] + a[400:500] b_sub = np.concatenate

假设我有一个列表:

import numpy as np
a = [2, 4, 6, 8, ..., 1000] # total 500 elements
b = np.array(a)             # numpy version
我想得到第1到第100个、第201到第300个、第401到第500个元素,并将它们组成一个新阵列

为此,我尝试了以下代码:

a_sub = a[0:100] + a[200:300] + a[400:500]
b_sub = np.concatenate((b[0:100], b[200:300], b[400:500]))
但是我想用一个简单的单行索引来实现它

说:


但是上面的内容都是无效的,我找不到这样的一个单行索引。

您可以将切片转换为掩码数组(通过切片一个数组),并使用
(or)操作符合并掩码数组

ones = np.ones(b.shape, dtype = bool)
mask = ones[ 0:100] | ones[200:300] | ones[400:500]
b_sub = b[mask]

请注意,如果切片重叠,或以非递增顺序显示,则会产生与原始代码不同的数组(项目不会重复,并且始终以与原始数组相同的顺序显示)。

您可以使用和来重新塑造形状,类似于此-

np.array(a).reshape(-1,100)[::2].ravel()
a.reshape(-1,100)[::2].ravel()
如果
a
是一个NumPy数组,您可以这样做-

np.array(a).reshape(-1,100)[::2].ravel()
a.reshape(-1,100)[::2].ravel()

好吧,这是纯python,但也许它可以解决您的问题

a = [2, 4, 6, 8, ..., 1000]
slices = ((0, 100), (200, 300), (400, 500))

def new_from_slices(list_, slices):
    return list(itertools.chain(*[list_[s[0]:s[1]] for s in slices]))
new_from_slices(a, slices)
另外两个一个班轮:

[x for i,x in enumerate(a) if i//100%2==0] #python
b[np.arange(len(b))//100%2==0] # numpy
您还可以使用:

或使用hstack(+按元素添加值)


我不知道这是否可能。或者你想要这个
a_sub=b[range(0100)+range(200300)+range(400500)]
我的意思是你不能将这样的列表索引到一行中,特别是
a_sub=a[(0:100200:300400:500)]
这里发布的解决方案对你有用吗?
a = np.arange(1000)
limits = [(0, 100), (200, 300), (400, 500)]
b = np.hstack(a[low:high] for low, high in limits)