首页 > 解决方案 > 调整使用 linspace 创建的数组大小:数组不拥有其数据

问题描述

我正在使用linspace创建一个数组:

>> a = np.linspace(0, 4, 9)
>> a
>> array([0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. ])

我正在成功调整它的大小,如下所示:

>> a.resize(3, 3)
>> a
>> array([[0. , 0.5, 1. ],
       [1.5, 2. , 2.5],
       [3. , 3.5, 4. ]])

但是,当我尝试如下调整它的大小时:

a.resize(4, 2, refcheck=False)

这给了我以下错误: ValueError: cannot resize this array: it does not own its data

当我创建相同的值数组并调整它的大小时,数组会成功调整大小:

>> b = np.array([0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. ])
>> b.resize(4, 2, refcheck=False)
>> b
>> array([[0. , 0.5],
       [1. , 1.5],
       [2. , 2.5],
       [3. , 3.5]])

两者都是a_bnumpy.ndarray

我的问题:为什么resize()在创建数组时会出现此错误linspace?当使用 3x3 调整大小(因此使用了数组的所有元素)时,它不会抱怨所有权,但即使我使用refcheck=False选项,为什么它也会抱怨 4x2?

我阅读了有关文档linspaceresize但找不到有关原因的答案。

标签: pythonpython-3.xnumpynumpy-ndarray

解决方案


如果您检查由您a.flags创建的数组,np.linspace()您将看到 OWNDATA 为 False。这意味着该数组是另一个数组的视图。您可以使用a.base查看其他数组。

至于为什么np.linspace()产生OWNDATA=False的数组,请看源码:https ://github.com/numpy/numpy/blob/v1.19.0/numpy/core/function_base.py#L23-L165

代码的最后一部分是这样做的:

return y.astype(dtype, copy=False)

copy=False意味着结果是一个视图。要获取 OWNDATA=True 的数组,可以使用a.copy(). 然后resize()使用 refcheck=False 将起作用。

另请参阅:Numpy,数组没有自己的数据?


推荐阅读