python - 调整使用 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
_b
numpy.ndarray
我的问题:为什么resize()
在创建数组时会出现此错误linspace
?当使用 3x3 调整大小(因此使用了数组的所有元素)时,它不会抱怨所有权,但即使我使用refcheck=False
选项,为什么它也会抱怨 4x2?
我阅读了有关文档linspace
,resize
但找不到有关原因的答案。
解决方案
如果您检查由您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,数组没有自己的数据?
推荐阅读
- centos7 - Centos7:如何更改桌面图标大小?
- python - OpenCV Python Canny 边缘检测是否应该根据图像大小给我非常不同的结果?
- office365 - 如何使用 Graph SDK 获取用户的邮箱设置
- ruby - 为什么 ruby 的 IO.read 添加换行符?
- php - 从查询结果到关联数组 Codeigniter
- json - 从 JSON 反序列化多维数组
- c# - 在 C# FileStream 中用 3 替换一个字节
- javascript - Webpack 4 正在摇树引导,我该如何防止呢?
- google-cloud-platform - GCP url map 为不同的后端服务创建路径规则
- ruby-on-rails - Rails 5.2.1 Webpacker Babel 没有转译 React