3

私の質問は、numpy での配列のスライスについてです。次の動作のロジックは何ですか?

x = arange(25)
x.shape = (5, 5)
# This results in a 2-d array in which rows and columns are excerpted from x
y = x[0:2, 0:2]
# But this results in a 1-d array
y2 = x[0:2, 0]

y2 は、行 0 と 1、列 0 の値を含む 2 次元配列であると予想していました。

4

3 に答える 3

5

x[0:2, 0:1]つまり、単一のアイテムスライスを使用して、期待される動作を得ることができます。ただし、1 つの要素が選択されるたびに、そのディメンションは折りたたまれます。気に入らないかもしれませんが、少し考えてみると、これが最も一貫した動作であることに気付くはずです。ロジックに従うx[0, 0]と、その位置に格納されているアイテムではなく、1 行 1 列の 2 次元配列になります。 .

于 2013-10-06T22:08:55.637 に答える
4

これは、標準の Python 規則に従います。これらの類似した式の結果を見てください。

>>> a = [0, 1, 2, 3, 4, 5]
>>> a[4]
4
>>> a[4:5]
[4]

ご覧のとおり、一方は1 つの itemを返し、もう一方は 1 つの itemを含むリストを返します。これは常に python の動作方法であり、numpy はその規則に従っているだけですが、より高い次元にあります。個々のアイテムではなくスライスを渡すと、リストが返されます。これは、終了インデックスが低すぎるか、開始インデックスが高すぎるために、リストにアイテムがない場合でも当てはまります。

>>> a[4:4]
[]
>>> a[6:6]
[]

したがって、すべての状況で、スライスを渡すことは「(指定された次元に沿って) シーケンスを返す」ことを意味し、整数を渡すことは「(指定された次元に沿って) 単一の項目を返す」ことを意味します。

于 2013-10-06T22:09:24.160 に答える
2

スライスの代わりに単一の要素を使用して配列にアクセスすると、その次元が折りたたまれます。そのため、

x = arange(25)
y = x[10]

であると予想yされますが10、そうではありませんarray([10])

したがって、使用する場合

y2 = x[0:2, 0]
print y2.shape
(2,)

二次元を崩壊させます。その 2 番目の次元を維持したい場合は、スライスを使用してその次元にアクセスする必要があります。

y2 = x[0:2, 0:1]
print y2.shape
(2, 1)
于 2013-10-06T22:10:47.243 に答える