如何在Python

时间:2015-11-21 05:39:12

标签: 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((b[0:100], b[200:300], b[400:500]))

但我想用一个简单的oneline-indexing

来做

说:

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]]

但以上都是无效的,我找不到这样的oneliner索引。

6 个答案:

答案 0 :(得分:3)

您可以使用np.reshapeslicing进行重塑,就像这样 -

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

如果a是NumPy数组,你可以这样做 -

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

答案 1 :(得分:1)

您可以将切片转换为蒙版数组(通过切割一个数组),并使用|(或)运算符将掩码数组合并。

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

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

答案 2 :(得分: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)

答案 3 :(得分:1)

您也可以使用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])

答案 4 :(得分:0)

另外两个单行:

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

答案 5 :(得分:0)

或使用hstack(+将元素添加元素)

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