获取序列的第一个和最后一个元素的最简单,最简洁的方法是什么?例如,我有一个序列[1, 2, 3, 4, 5]
,我希望通过某种切片魔法得到[1, 5]
。到目前为止我想出的是:
l = len(s)
result = s[0:l:l-1]
我实际上需要这个更复杂的任务。我有一个3D numpy数组,它是立方的(即大小为NxNxN,其中N可能不同)。我想要一种简单快捷的方法来获取包含源数组顶点值的2x2x2数组。上面的示例是我的任务的过度简化的1D版本。
答案 0 :(得分:6)
使用此:
result = [s[0], s[-1]]
答案 1 :(得分:3)
这将为您提供序列中第一个和最后一个元素的列表:
result = [s[0], s[-1]]
或者,这会给你一个元组
result = s[0], s[-1]
答案 2 :(得分:3)
由于你使用的是numpy数组,你可能想要使用花哨的索引:
a = np.arange(27)
indices = [0, -1]
b = a[indices] # array([0, 26])
对于3d案例:
vertices = [(0,0,0),(0,0,-1),(0,-1,0),(0,-1,-1),(-1,-1,-1),(-1,-1,0),(-1,0,0),(-1,0,-1)]
indices = list(zip(*vertices)) #Can store this for later use.
a = np.arange(27).reshape((3,3,3)) #dummy array for testing. Can be any shape size :)
vertex_values = a[indices].reshape((2,2,2))
我首先写下所有顶点(虽然我愿意打赌,有一种聪明的方法可以使用itertools
来实现它,这可以让你将它扩展到N维......)。指定顶点的顺序是它们在输出数组中的顺序。然后我“转置”顶点列表(使用zip
),以便所有x索引在一起,所有y索引在一起等等(这就是numpy喜欢它的方式)。此时,您可以保存该索引数组,并在需要方框的角时使用它来索引数组。您可以轻松地将结果重新整形为2x2x2阵列(尽管我拥有它的顺序可能不是您想要的顺序)。
答案 3 :(得分:3)
根据您提到的(N,N,N)
ndarray
X
的具体情况,以下内容适用于您?
s = slice(0,N,N-1)
X[s,s,s]
实施例
>>> N = 3
>>> X = np.arange(N*N*N).reshape(N,N,N)
>>> s = slice(0,N,N-1)
>>> print X[s,s,s]
[[[ 0 2]
[ 6 8]]
[[18 20]
[24 26]]]
答案 4 :(得分:2)
>>> from operator import itemgetter
>>> first_and_last = itemgetter(0, -1)
>>> first_and_last([1, 2, 3, 4, 5])
(1, 5)
答案 5 :(得分:1)
为什么要使用切片?获取每个元素
result = [s[0], s[-1]]
更好,更具可读性。
如果真的需要使用切片,那么您的解决方案是我能想到的最简单的工作方式。
这也适用于您提到的3D案例。