3

获取序列的第一个和最后一个元素的最简单和最干净的方法是什么?例如,我有一个序列[1, 2, 3, 4, 5],我想[1, 5]通过某种切片魔法来获得。到目前为止,我想出的是:

l = len(s)
result = s[0:l:l-1]

我实际上需要这个来完成更复杂的任务。我有一个 3D numpy 数组,它是立方的(即大小为 NxNxN,其中 N 可能会有所不同)。我想要一种简单快捷的方法来获取一个 2x2x2 数组,其中包含来自源数组顶点的值。上面的示例是我的任务的过度简化的 1D 版本。

4

6 回答 6

6

用这个:

result = [s[0], s[-1]]
于 2012-08-22T12:56:40.720 回答
3

(N,N,N) ndarray X对于您提到的 a 的特殊情况,以下内容对您有用吗?

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]]]
于 2012-08-22T14:03:46.423 回答
3

这将为您提供序列中第一个和最后一个元素的列表:

 result = [s[0], s[-1]]

或者,这会给你一个元组

 result = s[0], s[-1]
于 2012-08-22T12:57:11.763 回答
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 数组(尽管我拥有的顺序可能不是您想要的顺序)。

于 2012-08-22T13:04:33.673 回答
2
>>> from operator import itemgetter
>>> first_and_last = itemgetter(0, -1)
>>> first_and_last([1, 2, 3, 4, 5])
(1, 5)
于 2012-08-22T12:58:24.773 回答
1

为什么要使用切片?获取每个元素

result = [s[0], s[-1]]

更好,更具可读性。

如果您真的需要使用切片,那么您的解决方案是我能想到的最简单的解决方案。

这也适用于您提到的 3D 案例。

于 2012-08-22T12:58:30.503 回答