11

次の例では:

>>> import numpy as np
>>> a = np.arange(10)
>>> b = a[:,np.newaxis]
>>> c = b.ravel()
>>> np.may_share_memory(a,c)
False

numpy.ravel配列のコピーが返されるのはなぜですか? それはただ戻ってくるべきではありませんaか?

編集:

がコピーを返さnp.squeeze ないことを発見しました。

>>> b = a[:,np.newaxis]
>>> c = b.squeeze()
>>> np.may_share_memory(a,c)
True

この場合、なぜsqueezeとの間に違いがあるのでしょうか?ravel

編集:

mgilson が指摘したようにnewaxis、配列を不連続としてマークするためravel、コピーが返されます。

したがって、新しい問題はnewaxis、配列を不連続としてマークする理由です。

ただし、話はさらに奇妙になります。

>>> a = np.arange(10)
>>> b = np.expand_dims(a,axis=1)
>>> b.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False
>>> c = b.ravel()
>>> np.may_share_memory(a,c)
True

のドキュメントによると、expand_dimsと同等である必要がありますnewaxis

4

2 に答える 2

6

これはあなたの質問に対する最良の答えではないかもしれませんが、newaxis を挿入すると、numpy が配列を非連続として表示するように見えます-おそらくブロードキャストの目的で:

>>> a=np.arange(10)
>>> b=a[:,None]
>>> a.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False
>>> b.flags
  C_CONTIGUOUS : False
  F_CONTIGUOUS : False
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False

ただし、再形成によって次のことは発生しません。

>>> c=a.reshape(10,1) 
>>> c.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False

そして、これらの配列は同じメモリを共有します:

>>> np.may_share_memory(c.ravel(),a)
True

編集

np.expand_dims実際に実装されてreshapeいるため、機能します(これはドキュメントのわずかなエラーだと思います)。ソースは次のとおりです(docstringなし):

def expand_dims(a,axis):
    a = asarray(a)
    shape = a.shape
    if axis < 0:
        axis = axis + len(shape) + 1
    return a.reshape(shape[:axis] + (1,) + shape[axis:])
于 2012-07-23T18:37:41.720 に答える
3

ストライドと関係があるようです:

>>> c = np.expand_dims(a, axis=1)
>>> c.strides
(8, 8)

>>> b = a[:, None]
>>> b.strides
(8, 0)
>>> b.flags
  C_CONTIGUOUS : False
  F_CONTIGUOUS : False
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False
>>> b.strides = (8, 8)
>>> b.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False

ここで次元1のストライドがどのような違いをもたらすかはわかりませんが、それがnumpyに配列を連続していないと見なさせているようです。

于 2012-07-23T19:25:37.377 に答える