在以下示例中:
>>> import numpy as np
>>> a = np.arange(10)
>>> b = a[:,np.newaxis]
>>> c = b.ravel()
>>> np.may_share_memory(a,c)
False
Run Code Online (Sandbox Code Playgroud)
为什么要numpy.ravel返回我的数组的副本?它不应该只是返回a?
编辑:
我刚刚发现np.squeeze 它没有返回副本.
>>> b = a[:,np.newaxis]
>>> c = b.squeeze()
>>> np.may_share_memory(a,c)
True
Run Code Online (Sandbox Code Playgroud)
为什么在这种情况下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
Run Code Online (Sandbox Code Playgroud)
根据文档expand_dims,它应该相当于newaxis.
这可能不是您问题的最佳答案,但看起来插入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
Run Code Online (Sandbox Code Playgroud)
但是,重塑不会导致:
>>> c=a.reshape(10,1)
>>> c.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : False
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
Run Code Online (Sandbox Code Playgroud)
那些数组确实共享相同的内存:
>>> np.may_share_memory(c.ravel(),a)
True
Run Code Online (Sandbox Code Playgroud)
编辑
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:])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2223 次 |
| 最近记录: |