我可以像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数组。用你更清楚的逻辑,我支持你的答案,因为它教会了我同样好的东西。