2016-10-07 1 views
3

numpy.reshapeで特定のnumpy配列を平坦化すると、一見矛盾した結果に遭遇しました。時々私は配列を変形すると、1行の2D配列を返しますが、最初に配列をコピーしてから全く同じ操作を実行すると、1D配列が返されます。コピーしたアレイとコピーしていないアレイでナンシーの変形が異なる

これは主にnumpy配列をscipy配列と組み合わせたときに発生すると思われ、後で平坦化配列に行列を掛けたいときに配置問題が発生します。それは印刷し実行すると

import numpy as np 
import scipy.sparse as sps 

n = 10 
A = np.random.randn(n,n) 
I = sps.eye(n) 
X = I+A 

x1 = np.reshape(X, -1) 
x2 = np.reshape(np.copy(X), -1) 

print 'x1.shape=', x1.shape 
print 'x2.shape=', x2.shape 

は、たとえば、次のコードを考えてみ

x1.shape= (1, 100) 
x2.shape= (100,) 

同じことがnumpy.flattenで発生()。ここで何が起こっているのですか?この動作は意図的ですか?

+0

これはあなたがしたように 'X'を構築するまでパズルだったので、結果を見ました。 'array'ではなく' matrix'として出力されます。あなたは 'print X'(' n = 3'のために)を含めるべきです。 – hpaulj

答えて

5

あなたが一緒に疎行列オブジェクトと正常ndarrayを追加:

X = I+A 

結果は、高密度マトリックスオブジェクト、np.matrixのインスタンスではなく、正常ndarrayあります。

これ:

np.reshape(X, -1) 

が2Dよりも小さくすることができないマトリックスを、復帰してしまいます。

は、この:あなたがnp.reshapeから1Dの出力を得るよう

np.reshape(np.copy(X), -1) 

は、np.copy(X)で通常のndarrayになります。

スパース行列、密行列、または標準ndarrayのどちらを扱っているかについては、常に十分に注意してください。可能であれば、np.matrixは避けてください。

関連する問題