2017-09-14 6 views
2

NumPy 1.11.1と1.13.1で異なるストーリーを返す関数ascontiguousarray()に問題があります。関数ascontiguousarrayは、NumPy 1.11.1と1.13.1で異なるストライドを返します。

(Ubuntuの16.04、Pythonの2.7.12)を再現するコード:numpyの1.11.1で

import os 
import numpy as np 

x = np.array([[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16]],dtype='uint32') 
x = x.T 
x = np.ascontiguousarray(x) 
print(x.strides) 

それは進歩を返します(64、4)(私の意見で正しい前進)

でNumPy 1.13.1ストライドが返されます:(4、4)(予期しない進歩)

説明や解説ですべての助けをいただきありがとうございます。

+0

さて私は、X 'はどこメモリの図である 'だと思います元の配列を初期化しました。それはそれと関係があります。正しいストライドは何ですか?また、バージョン間の相違点は何ですか? - 本当にわからない。 – Divakar

+0

興味深い。この場合、 'y = x.T;を実行すると、 z = np.ascontiguousarray(y) 'をチェックし、' z is y'をチェックすると、結果は 'True'です:それらはまったく同じオブジェクトです(同じデータのビューだけではありません)。 'x'のストライドは(4、4)であり、' x'の転置はストライドを反転させるだけなので、 'y'は' x'と同じ進歩をします。 1.6.2では、 'y.flags'は' C_CONTIGUOUS'の 'False'を示しますが、1.13.1では' y.flags'は 'C_CONTIGUOUS'が' True'であることを示しています。 *それはここで重要な根本的な変化のようです。あなたの質問に答えるために、なぜそれが変わったのかを知る必要があります。 –

答えて

0

私はこの疑わしいストライド((4,4))をorderが説明していると思います。

一般列配列:

In [289]: np.ones((3,1),int).strides 
Out[289]: (4, 4) 

通常行アレイ:

In [290]: np.ones((1,3),int).strides 
Out[290]: (12, 4) 

しかしFを注文する行配列を変更し、ストライド列アレイのようになる:

In [291]: np.ones((1,3),int,order='F').strides 
Out[291]: (4, 4) 

転置はF_contiguousであり、注文F配列:

In [292]: np.ones((3,1),int).T.flags 
Out[292]: 
    C_CONTIGUOUS : True 
    F_CONTIGUOUS : True 
    OWNDATA : False 
    WRITEABLE : True 
    ALIGNED : True 
    UPDATEIFCOPY : False 
In [293]: np.ones((3,1),int).T.strides 
Out[293]: (4, 4) 

(一次元のサイズ1であるためnp.ones((3,1),int)は、また、二重連続しています)。

私はCため、進歩が変更に転置を強制する場合は、次の順序F

In [305]: np.ones((3,1),int).T.copy(order='C').strides 
Out[305]: (12, 4) 

列配列を:

In [312]: np.ones((3,1),int,order='F').strides 
Out[312]: (4, 12) 
+0

良い説明、ありがとう。回避策はありますか?私の回避策は、x = np.ascontiguousarray(x)の後にx = np.array(x、order = 'C')でCの順序を強制することです。 – skorpion

+0

1.11.1でなぜ動作するのか分かりますか? – skorpion

+0

(4,4)の何が問題なのですか?どのように 'strides'を使っていますか? – hpaulj

関連する問題