3

ビュー メソッドを使用してフィールドを配列に割り当てる際に問題が発生しています。どうやら、フィールドをどのように割り当てたいかを制御することはできないようです。

a=array([[1,2],[1,2],[1,2]]) # 3x2 matrix
#array([[1, 2],
#       [1, 2],
#       [1, 2]])  

aa=a.transpose() # 2x3 matrix
#array([[1, 1, 1],
#       [2, 2, 2]])

a.view(dtype='i8,i8') # This works
a.view(dtype='i8,i8,i8') # This returns error ValueError: new type not compatible with array.
aa.view(dtype='i8,i8') # This works
aa.view(dtype='i8,i8,i8') # This returns error ValueError: new type not compatible with array.

実際、a の転置を使用する代わりにゼロから aa を作成すると、

b=array([[1,1,1],[2,2,2]])
b.view(dtype='i8 i8') # This returns ValueError again.
b.view(dtype='i8,i8,i8') # This works

なぜこれが起こるのですか?行または列を表すようにフィールドを設定する方法はありますか?

4

2 に答える 2

2

NumPy で標準配列を作成すると、メモリのいくつかの連続したブロックがデータによって占有されます。各ブロックのサイズはdtype、配列の形状によるこれらのブロックの数と編成によって異なります。構造化配列は同じパターンに従いますが、各ブロックが複数のサブブロックで構成され、各サブブロックが対応dtypeするフィールドによって定義されたスペースを占有する点が異なります。

あなたの例では(3,2)、int の配列 ( a) を定義します。これは、最初の行のint2 つのブロックであり、2 番目の行の他の 2 つのブロックが続き、最初の行の最後の 2 つのブロックが続きます。これを構造化配列に変換する場合は、元のレイアウトを維持するか (各ブロックが一意のフィールド ( a.view(dtype=[('f0', int)]) になります)、または 2 ブロックの行を 2 つのサブブロックで構成される 1 つの大きなブロックの行に変換します。 -block はintサイズを持っていますa.view(dtype=[('f0',int),('f1',int)])

対応する情報が異なる行に分散されるため、より大きなブロック (つまり、 )を作成することはできません。dtype="i8,i8,i8"

これで、配列を別の方法で表示できます。たとえば、列ごとに表示できます。これ.transposeは、配列の a を実行したときに起こることです。ただし、表示のみ (NumPy 用語では「ビュー」) であり、元のメモリ レイアウトは変更されません。したがって、あなたのaa例では、元のレイアウトは「2つの整数の3行」であり、「2つの整数の1つのブロックの3行」として表すことができます。

2 番目の例ではb=array([[1,1,1],[2,2,2]])、レイアウトが異なります: 2 行 3intブロックです。dtype="i8,i8,i8"行を超えていないため、3 つの int ブロックを 1 つの大きなブロック ( ) にグループ化できます。各行に余分なブロックがあるため、2 つずつグループ化することはできません。

(N,M)標準配列は、(1) フィールドのN構造化配列、Mまたは (2) 1 つのフィールドの構造化配列のみに 変換できますNxM。それだけです。は(N,M)、作成時に配列に与えられた形状です。転置によって配列を配列として表示できます(M,N)が、元のメモリ レイアウトは変更されません。

于 2012-08-30T07:27:16.363 に答える
0

b.view(dtype='i8, i8')値を2つの値を持つタプルのセットとして再解釈するように求めているときにビューを指定するnumpyと、2の倍数ではない3つの値があるため、これは単純に実行できません。異なるサイズの新しい行列を生成しますが、numpy はそのようなことを好みません。

于 2012-08-30T05:56:03.200 に答える