Numpy,阵列没有自己的数据?

Had*_*adi 16 python numpy

我尝试以resize这种方式在数组上使用:

a = np.array([1,2,3,4,5,6], dtype=np.uint8)
a.resize(4,2)
print a 
Run Code Online (Sandbox Code Playgroud)

输出是OK!(我的意思是没有错误).但是当我运行这段代码时:

a = np.array([1,2,3,4,5,6], dtype=np.uint8).reshape(2,3)
a.resize(4,2)
print a 
Run Code Online (Sandbox Code Playgroud)

它引起了一个错误,说, ValueError: cannot resize this array: it does not own its data

我的问题:为什么应用reshape数组的所有权后会改变?所有权授予谁!?在reshape不创建一个新的内存,它是在同一阵列存储器上执行它的操作!那么为什么所有权会发生变化?

我读了np.reshapendarray.resize doc,但我无法理解原因.我读过这篇文章.我可以ndarray.flags在应用该resize方法之前始终检查.

Dan*_*iel 16

让我们从以下开始:

>>> a = np.array([1,2,3,4,5,6], dtype=np.uint8)
>>> b = a.reshape(2,3)
>>> b[0,0] = 5
>>> a
array([5, 2, 3, 4, 5, 6], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)

我在这里可以看到数组b不是它自己的数组,而只是一个视图a(只是了解"OWNDATA"标志的另一种方式).简单地说两者ab在内存中引用相同的数据,但是以不同的形状b查看a.调用resize等功能ndarray.resize试图改变数组到位,因为b仅仅是一个视图a,这是不允许从resize定义:

引用计数检查的目的是确保不将此数组用作另一个Python对象的缓冲区,然后重新分配内存.


要绕过您的问题,您可以resize从numpy(而不是ndarray的属性)调用,它将检测此问题并自动复制数据:

>>> np.resize(b,(4,2))
array([[5, 2],
       [3, 4],
       [5, 6],
       [5, 2]], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)

编辑:由于CT朱正确地提到np.resizendarray.resize以两种不同的方式添加数据.要重现预期的行为,ndarray.resize您必须执行以下操作:

>>> c = b.copy()
>>> c.resize(4,2)
>>> c
array([[5, 2],
       [3, 4],
       [5, 6],
       [0, 0]], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)

  • 另一种方法是修改数组的`shape`属性.(例如`a.shape =(2,3)`)这会在不创建新视图的情况下对其进行重新整形. (3认同)