假设我有一个清单:
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索引。
答案 0 :(得分:3)
您可以使用np.reshape
和slicing
进行重塑,就像这样 -
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)