gpt4 book ai didi

python - 为什么 numpy.ravel 返回一个副本?

转载 作者:太空狗 更新时间:2023-10-29 18:30:51 25 4
gpt4 key购买 nike

在下面的例子中:

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

为什么在这种情况下 squeezeravel 之间存在差异?

编辑:

正如 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

最佳答案

这可能不是您问题的最佳答案,但看起来插入 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

但是, reshape 不会导致:

>>> 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:])

关于python - 为什么 numpy.ravel 返回一个副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11618211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com