我可以像python中的数组方式索引一样进行数组方式切片吗?

我可以像python中的数组方式索引一样进行数组方式切片吗?,python,arrays,list,numpy,Python,Arrays,List,Numpy,如何进行阵列方式切片? 我想得到项目2,3;7,8在数组a中,给定start\u idx和end\u idx。我尝试了a[[0,1],start\u idx:end\u idx],但失败了 import numpy as np a = np.array([[1,2,3,4], [5,6,7,8]]) start_idx=[1,2] end_idx=[3,4] a[[0,1], start_idx: end_idx]] <- failed [a[0,1:3], a[1,2:4]] #[arr

如何进行阵列方式切片? 我想得到项目
2,3;7,8
在数组
a
中,给定
start\u idx
end\u idx
。我尝试了
a[[0,1],start\u idx:end\u idx]
,但失败了

import numpy as np
a = np.array([[1,2,3,4], [5,6,7,8]])
start_idx=[1,2]
end_idx=[3,4]
a[[0,1], start_idx: end_idx]] <- failed
[a[0,1:3], a[1,2:4]] #[array([2, 3]), array([7, 8])] <- wanted result
将numpy导入为np
a=np.数组([[1,2,3,4],[5,6,7,8]]
start_idx=[1,2]
end_idx=[3,4]

a[[0,1],start\u idx:end\u idx]]您可以使用列表理解:

result = [a[i, start_idx[i]:end_idx[i]] for i in range(len(start_idx))]
print (result) 
输出

[array([2, 3]), array([7, 8])]

您可以使用列表理解:

result = [a[i, start_idx[i]:end_idx[i]] for i in range(len(start_idx))]
print (result) 
输出

[array([2, 3]), array([7, 8])]

您可以将列表理解与
enumerate
zip
一起使用:

res = [a[idx, start: end] for idx, (start, end) in enumerate(zip(start_idx, end_idx))]

# [array([2, 3]), array([7, 8])]
这类似于@Bazingaa的解决方案,但直接迭代
start\u idx
/
end\u idx
,而不是位置列表索引

性能优势微乎其微,只有在大型阵列中才会显现出来。但是,您可能会发现枚举逻辑更具可读性

n = 100000
a = np.array([[1,2,3,4], [5,6,7,8]]*n)
start_idx = [1,2] * n
end_idx = [3,4] * n

def indexing(a, start_idx, end_idx):
    return [a[i, start_idx[i]:end_idx[i]] for i in range(len(start_idx))]

def enumerating(a, start_idx, end_idx):
    return [a[idx, start: end] for idx, (start, end) in enumerate(zip(start_idx, end_idx))]

%timeit indexing(a, start_idx, end_idx)     # 140 ms
%timeit enumerating(a, start_idx, end_idx)  # 124 ms

您可以将列表理解与
enumerate
zip
一起使用:

res = [a[idx, start: end] for idx, (start, end) in enumerate(zip(start_idx, end_idx))]

# [array([2, 3]), array([7, 8])]
这类似于@Bazingaa的解决方案,但直接迭代
start\u idx
/
end\u idx
,而不是位置列表索引

性能优势微乎其微,只有在大型阵列中才会显现出来。但是,您可能会发现枚举逻辑更具可读性

n = 100000
a = np.array([[1,2,3,4], [5,6,7,8]]*n)
start_idx = [1,2] * n
end_idx = [3,4] * n

def indexing(a, start_idx, end_idx):
    return [a[i, start_idx[i]:end_idx[i]] for i in range(len(start_idx))]

def enumerating(a, start_idx, end_idx):
    return [a[idx, start: end] for idx, (start, end) in enumerate(zip(start_idx, end_idx))]

%timeit indexing(a, start_idx, end_idx)     # 140 ms
%timeit enumerating(a, start_idx, end_idx)  # 124 ms


a
的定义中存在语法错误。以
结束<代码>[a[0,1:3],a[1,2:4]
这样就可以了。否则,您可以使用列表理解谢谢@Bazingaa,我已更新。行切片的长度是否始终相同?@hpaulj,它们可能不同。而且
len(start_idx)
有点大。然后结果必须是一个列表,并且过程需要在行上进行迭代。在
a
的定义中存在语法错误。以
结束<代码>[a[0,1:3],a[1,2:4]这样就可以了。否则,您可以使用列表理解谢谢@Bazingaa,我已更新。行切片的长度是否始终相同?@hpaulj,它们可能不同。而且
len(start_idx)
有点大。然后结果必须是一个列表,过程需要在行上迭代。首先,确保您理解为什么这个循环有效,而您失败的方法无效。@hpaulj:我想很清楚为什么失败的方法无效。切片索引应该是整数,而不是列表。对不起,我的评论是针对OP的。首先,确保你理解为什么这个循环有效,而你失败的方法无效。@hpaulj:我想很清楚为什么失败的方法无效。切片索引应该是整数,而不是列表。对不起,我的评论是针对OP的。谢谢你的回答。只是想知道这两种方法是否都能提高速度?@Bazingaa,请参阅更新,您可能会看到更大阵列的一点好处。嗯。尽管收益很小,但还是很有趣。@Bazingaa,是的。我的意思是,在这里你没有看到矢量化操作,因为你的数组结果可能是参差不齐的,因此可能不适合常规的NumPy数组。用你更清楚的逻辑。我支持你的答案,因为它教会了我同样好的东西。谢谢你的替代答案。只是想知道这两种方法是否都能提高速度?@Bazingaa,请参阅更新,您可能会看到更大阵列的一点好处。嗯。尽管收益很小,但还是很有趣。@Bazingaa,是的。我的意思是,在这里你没有看到矢量化操作,因为你的数组结果可能是参差不齐的,因此可能不适合常规的NumPy数组。用你更清楚的逻辑,我支持你的答案,因为它教会了我同样好的东西。