我试图用这种方式在数组上使用resize
:
a = np.array([1,2,3,4,5,6], dtype=np.uint8)
a.resize(4,2)
print a
输出正常!(我的意思是没有错误)。但是当我运行这个代码时:
a = np.array([1,2,3,4,5,6], dtype=np.uint8).reshape(2,3)
a.resize(4,2)
print a
它产生了一个错误,说,ValueError: cannot resize this array: it does not own its data
我的问题是:为什么在应用reshape
之后数组的所有权发生了更改?所有权授予谁!?reshape
不创建新内存,它正在同一个数组内存上执行操作!那为什么所有权会改变呢?
我读了np.reshape和ndarray.resize文档,但我不明白原因。我读过this post。我可以在应用resize
方法之前检查ndarray.flags
。
让我们从以下内容开始:
我在这里可以看到数组
b
不是它自己的数组,而是a
的视图(只是理解“OWNDATA”标志的另一种方式)。简单地说,a
和b
引用内存中的相同数据,但是b
是用不同的形状查看a
。调用像ndarray.resize
这样的resize
函数将尝试更改数组的位置,因为b
只是a
的视图。从resize
定义来看,这是不允许的:为了避免您的问题,您可以从numpy调用
resize
(不是ndarray的属性),后者将检测此问题并自动复制数据:编辑:正如CT-Zhu正确地提到的,
np.resize
和ndarray.resize
以两种不同的方式添加数据。要将预期行为重新生成为ndarray.resize
,必须执行以下操作:相关问题 更多 >
编程相关推荐