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,这就是它起作用的原因(我想这是文档中的一个小错误)。这是源代码(没有文档字符串):

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 回答