numpy reshapeで-1はどういう意味ですか?


420

numpy行列は、パラメーター-1のreshape関数を使用してベクトルに再形成できます。しかし、ここでは-1の意味がわかりません。

例えば:

a = numpy.matrix([[1, 2, 3, 4], [5, 6, 7, 8]])
b = numpy.reshape(a, -1)

の結果bは次のとおりです。matrix([[1, 2, 3, 4, 5, 6, 7, 8]])

ここに-1の意味を知っている人はいますか?そしてそれはpythonが-1などいくつかの意味を割り当てているようです:array[-1]最後の要素を意味します:説明してもらえますか?

回答:


567

新しい形状を提供するために満たす基準は、新しい形状は元の形状と互換性があること」です。

numpyを使用すると、新しい形状パラメーターの1つを-1として指定できます(例:(2、-1)または(-1,3)、ただし(-1、-1)は不可)。それは単にそれが未知の次元であることを意味し、私たちはナンピーにそれを理解してもらいたいのです。そしてnumpyは「配列の長さと残りの次元」を見て、それが上記の基準を満たすことを確認することでこれを理解し ます

今例を見てください。

z = np.array([[1, 2, 3, 4],
         [5, 6, 7, 8],
         [9, 10, 11, 12]])
z.shape
(3, 4)

(-1)で形を変えようとしています。結果の新しい形状は(12、)であり、元の形状(3,4)と互換性があります

z.reshape(-1)
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

(-1、1)で形を変えようとしています。列は1、行は不明として指定しています。したがって、(12、1)として結果の新しい形状が得られます。再び元の形状(3,4)と互換性があります。

z.reshape(-1,1)
array([[ 1],
   [ 2],
   [ 3],
   [ 4],
   [ 5],
   [ 6],
   [ 7],
   [ 8],
   [ 9],
   [10],
   [11],
   [12]])

上記は、単一の機能numpyに使用するreshape(-1,1)ためのアドバイス/エラーメッセージと一致しています。つまり、単一の列

array.reshape(-1, 1)データに単一の機能がある場合に使用してデータを再形成する

(-1、2)のような新しい形状。行不明、列2。結果として新しい形状(6、2)を取得

z.reshape(-1, 2)
array([[ 1,  2],
   [ 3,  4],
   [ 5,  6],
   [ 7,  8],
   [ 9, 10],
   [11, 12]])

現在、列を不明として保持しようとしています。(1、-1)のような新しい形状。つまり、行は1、列は不明です。(1、12)のような新しい形状が得られます

z.reshape(1,-1)
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]])

上記は、単一のサンプルnumpyに使用するreshape(1,-1)ためのアドバイス/エラーメッセージと一致しています。つまり、単一行

単一のサンプルarray.reshape(1, -1)が含まれている場合に使用してデータを再形成する

新しい形状(2、-1)。行2、列は不明です。(2,6)として結果の新しい形状を取得します

z.reshape(2, -1)
array([[ 1,  2,  3,  4,  5,  6],
   [ 7,  8,  9, 10, 11, 12]])

(3、-1)としての新しい形状。行3、列は不明です。(3,4)として結果の新しい形状を取得します

z.reshape(3, -1)
array([[ 1,  2,  3,  4],
   [ 5,  6,  7,  8],
   [ 9, 10, 11, 12]])

そして最後に、両方の次元を不明として、つまり(-1、-1)として新しい形状を提供しようとすると、エラーが発生します

z.reshape(-1, -1)
ValueError: can only specify one unknown dimension

11
この回答には多くの例が含まれていますが、平易な英語で-1が何をするかを示していません。配列を再形成する場合、新しい形状には古い形状と同じ数の要素が含まれている必要があります。つまり、2つの形状の寸法の積は等しくなければなりません。-1を使用する場合、-1に対応する次元は、元の配列の次元の積をreshape、同じ数の要素を維持するために与えられた次元の積で割ったものになります。
BallpointBen 2018

1
私の意見では受け入れ答えとこの答えは受け入れられた答えは、よりシンプルであるのに対し、私はシンプルな答えを好む、両方の役に立つ
cloudscomputes

1
形状(12、1)は形状(3、4)とどのように「互換性」がありますか?
Vijender

1
@Vijenderそれは要素の数は同じであるが軸が異なることを意味すると思います-つまり12x1 == 3x4?
デビッドウォーターワース

80

配列の形状を変更するために使用されます。

2 x 10 x 10の3次元配列があるとします。

r = numpy.random.rand(2, 10, 10) 

次に、5 X 5 x 8に変形します。

numpy.reshape(r, shape=(5, 5, 8)) 

仕事をします。

最初のdim = 5と2番目のdim = 5を修正すると、3番目の次元を決定する必要がないことに注意してください。あなたの怠惰を助けるために、pythonは-1のオプションを提供します:

numpy.reshape(r, shape=(5, 5, -1)) 

形状=(5、5、8)の配列が得られます。

同様に、

numpy.reshape(r, shape=(50, -1)) 

形状の配列を提供します=(50、4)

詳細については、http://anie.me/numpy-reshape-transpose-theano-dimshuffle/をご覧ください。


59

によるとthe documentation

newshape:intまたはintのタプル

新しい形状は、元の形状と互換性がある必要があります。整数の場合、結果はその長さの1次元配列になります。1つの形状の次元は-1にすることができます。この場合、値は配列の長さと残りの次元から推測されます。


この場合、値は[1、8]と推定されます。そして、行列aの総数は8です。正しい?
user2262504 2013

@ user2262504、わかりません。推測された値は[8]、ドキュメントにそう書かれているためだと思います(1-D array)。お試しくださいnumpy.reshape(a, [8])numpy.reshape(a, [1,8])マトリックスと同じ結果になります。
falsetru

3
-1を指定すると、numpyによって、結果の行列の列または行の数が不明になります。注:不明は列または行のいずれかである必要があり、両方ではありません。
ガタイド2017年

15

numpy.reshape(a、newshape、order {})詳細については、以下のリンクを確認してください。 https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

以下の例では、出力は結果のベクトルが単一の行になることを説明しています。(-1)は、行数が1であることを示します。

a = numpy.matrix([[1, 2, 3, 4], [5, 6, 7, 8]])
b = numpy.reshape(a, -1)

出力:

行列([[1、2、3、4、5、6、7、8]])

これは別の例でより正確に説明できます:

b = np.arange(10).reshape((-1,1))

出力:(1次元の列配列です)

array([[0]、

   [1],
   [2],
   [3],
   [4],
   [5],
   [6],
   [7],
   [8],
   [9]])

b = np.arange(10).reshape((1、-1))

出力:(1次元の行配列です)

配列([[0、1、2、3、4、5、6、7、7、8、9]])


12

かなりわかりやすいです。「-1」は「未知の次元」を表し、別の次元から推測することができます。この場合、マトリックスを次のように設定すると、

a = numpy.matrix([[1, 2, 3, 4], [5, 6, 7, 8]])

次のようにマトリックスを変更します。

b = numpy.reshape(a, -1)

これは、マトリックスaに対していくつかのデフォルトの操作を呼び出し、1次元のnumpy配列/行列を返します。

しかし、私はこのようなコードを使用することは良い考えではないと思います。試してみませんか:

b = a.reshape(1,-1)

同じ結果が得られ、読者が理解しやすくなります。aの別の形状としてbを設定します。aの場合、必要な列数はありません(-1に設定します)が、1次元配列が必要です(最初のパラメーターを1に設定します)。


9

簡単に言えば、いくつかの次元を設定し、NumPyに残りの要素を設定させます。

(userDim1, userDim2, ..., -1) -->>

(userDim1, userDim1, ..., TOTAL_DIMENSION - (userDim1 + userDim2 + ...))

これは私が探していた英語での答えです。つまり、あなたはあなたのデザインを好み、残りの数学をnumpyに計算させます:)
Sumanth Lazarus

6

それは単に、与えることができる行または列の数がわからないことを意味し、再構成する列または行の数を提案するようにnumpyに要求しています。

numpyは-1の最後の例を提供し ますhttps://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

(-1)について理解を深めるには、以下のコードとその出力を確認してください。

コード:-

import numpy
a = numpy.matrix([[1, 2, 3, 4], [5, 6, 7, 8]])
print("Without reshaping  -> ")
print(a)
b = numpy.reshape(a, -1)
print("HERE We don't know about what number we should give to row/col")
print("Reshaping as (a,-1)")
print(b)
c = numpy.reshape(a, (-1,2))
print("HERE We just know about number of columns")
print("Reshaping as (a,(-1,2))")
print(c)
d = numpy.reshape(a, (2,-1))
print("HERE We just know about number of rows")
print("Reshaping as (a,(2,-1))")
print(d)

出力:-

Without reshaping  -> 
[[1 2 3 4]
 [5 6 7 8]]
HERE We don't know about what number we should give to row/col
Reshaping as (a,-1)
[[1 2 3 4 5 6 7 8]]
HERE We just know about number of columns
Reshaping as (a,(-1,2))
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
HERE We just know about number of rows
Reshaping as (a,(2,-1))
[[1 2 3 4]
 [5 6 7 8]]

2
import numpy as np
x = np.array([[2,3,4], [5,6,7]]) 

# Convert any shape to 1D shape
x = np.reshape(x, (-1)) # Making it 1 row -> (6,)

# When you don't care about rows and just want to fix number of columns
x = np.reshape(x, (-1, 1)) # Making it 1 column -> (6, 1)
x = np.reshape(x, (-1, 2)) # Making it 2 column -> (3, 2)
x = np.reshape(x, (-1, 3)) # Making it 3 column -> (2, 3)

# When you don't care about columns and just want to fix number of rows
x = np.reshape(x, (1, -1)) # Making it 1 row -> (1, 6)
x = np.reshape(x, (2, -1)) # Making it 2 row -> (2, 3)
x = np.reshape(x, (3, -1)) # Making it 3 row -> (3, 2)

0

変換の最終結果は、最終配列の要素数が初期配列またはデータフレームの要素数と同じになることです。

-1は、行または列の不明なカウントに対応します。x(不明)と考えることができます。x元の配列の要素の数を、-1で順序付けられたペアの他の値で割ることによって得られます。

reshape(-1,1)の12個の要素は、x= 12/1 = 12行と1列の配列に対応します。


reshape(1、-1)の12個の要素は、1行とx= 12/1 = 12 列の配列に対応します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.