我尝试以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.reshape和ndarray.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"标志的另一种方式).简单地说两者a并b在内存中引用相同的数据,但是以不同的形状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.resize并ndarray.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)
| 归档时间: |
|
| 查看次数: |
13843 次 |
| 最近记录: |