2013-12-22 4 views
13

誰も私にこれを説明できますか? (Python 3.3.2、numpy 1.7.1):NumPyサイズ変更メソッド

>>> a = np.array([[1,2],[3,4]]) 
>>> a # just a peek 
array([[1, 2], 
     [3, 4]]) 
>>> a.resize(3,2) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: cannot resize an array references or is referenced 
by another array in this way. Use the resize function 
>>> a = np.array([[1,2],[3,4]]) 
>>> a.resize(3,2) 
>>> a 
array([[1, 2], 
     [3, 4], 
     [0, 0]]) 
>>> a = np.array([[1,2],[3,4]]) 
>>> print(a) # look properly this time 
[[1 2] 
[3 4]] 
>>> a.resize(3,2) 
>>> a 
array([[1, 2], 
     [3, 4], 
     [0, 0]]) 

なぜアレイを覗いて参照するのですか? (または、少なくとも、私は見終わった後でもその参照がなぜ残っているのですか?) また、それは私だけか、その例外は少し書き直す必要がありますか? documentation(強調鉱山)から

+2

あなただけではありません。例外メッセージには「参照」の前に「which」がなく、健全な句読点と大文字を使用することができます。 –

答えて

10

参照カウントチェックの目的は、あなたが他のPythonオブジェクトのためのバッファとしてこの配列を使用していないことを確認した後、メモリを再割り当てすることです。しかし、参照カウントが他の方法で増加する可能性があるので、この配列のメモリを別のPythonオブジェクトと共有していないと確信できるのであれば、安全にrefcheckからFalseに設定すると安全です。

"peek"は、printのように、後で参照カウントを減少させません。これは、インタプリタでは、最後の計算の結果が_に割り当てられているためです。試してみてください:

print(_) # shows array 
a.resize((3, 2), refcheck=False) # works 

を別の方法として、あなたはこれらの間の他の計算を(例えば、単に1 + 2)を行う場合には、この意志を_からあなたの配列を逆参照。

+0

意味があります(エラーメッセージよりも)。おそらく、それはしてはいけません...私は、配列のビューを作成すると参照を作成することを理解しました - 他の操作はそうしていますか? – xnx

+2

この場合は、最後の計算結果を '_'に代入するインタプリタを使用しているからです。私はエラーメッセージがひどく役に立たないことに同意します! – jonrsharpe

+0

私は実際には今まで知りませんでした。卑劣な...ありがとう! – xnx

関連する問題