3

シーケンスの最初と最後の要素を取得するための最も簡単でクリーンな方法は何ですか?たとえば、シーケンスがあり、ある種のスライスマジックを使用[1, 2, 3, 4, 5]したいと思います。[1, 5]私がこれまでに思いついたのは:

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

私は実際にはもう少し複雑なタスクのためにこれが必要です。私は3Dnumpy配列を持っています。これは立方体です(つまり、サイズはNxNxNで、Nは変化する可能性があります)。ソース配列の頂点からの値を含む2x2x2配列を取得する簡単で高速な方法が必要です。上記の例は、私のタスクの過度に単純化された1Dバージョンです。

4

6 に答える 6

6

これを使って:

result = [s[0], s[-1]]
于 2012-08-22T12:56:40.720 に答える
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 に答える
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]]]
于 2012-08-22T14:03:46.423 に答える
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 に答える