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

9
假设我有一个列表:
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]))

但我希望使用一行代码进行索引。
比如说:
a_sub = a[(0:100, 200:300, 400:500)]
a_sub = a[[0:100, 200:300, 400:500]]
b_sub = b[[0:100, 200:300, 400:500]]
b_sub = b[[0:100, 200:300, 400:500]]

但是上述方法都无效,我找不到这样一个一行代码的索引。

1
我不知道这是否可能。或者你想要这个 a_sub = b[range(0,100)+range(200,300)+range(400,500)] - Akshay Hazari
我的意思是你不能像这样在一行中索引一个列表,具体地说是a_sub = a[(0:100, 200:300, 400:500)] - Akshay Hazari
这里发布的解决方案是否对您有用? - Divakar
6个回答

3

您可以使用np.reshapeslicing进行重塑,操作如下 -

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

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

请注意,此解决方案仅适用于大小和间距恒定的区间(例如 OP 示例中每 100 个项目的一个大小为 100 的区间)。 - Nestor Demeure

2
您可以将切片转换为掩码数组(通过切片一个全1数组),并使用|(或)运算符联合这些掩码数组。
ones = np.ones(b.shape, dtype = bool)
mask = ones[ 0:100] | ones[200:300] | ones[400:500]
b_sub = b[mask]

请注意,如果您的切片重叠或以非递增顺序出现,则会得到与原始代码不同的数组(项目不会重复,并且始终按照原始数组中的顺序出现)。

2
你也可以使用 np.split
a = range(2, 1002, 2)
edges = [100, 200, 300, 400]
subarrays = np.split(a, edges)
b = np.hstack(subarrays[i] for i in [0, 2, 4])

1

这是纯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)

0

另外两个一行代码:

[x for i,x in enumerate(a) if i//100%2==0] #python
b[np.arange(len(b))//100%2==0] # numpy

0

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

a = np.arange(1000)
limits = [(0, 100), (200, 300), (400, 500)]
b = np.hstack(a[low:high] for low, high in limits)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接