python - Numpy ndarray 视图方法和基本属性
问题描述
在 Numpy 中,我们可以创建一个新的数组对象,使用 view 方法从另一个数组对象中查看相同的数据。
这将使数组的浅对象。新数组将具有与现有数组相同的数据(实际上是对它的引用),因此新数组的数据部分将只是对现有数组数据的引用!(我们可以调整新数组的大小而无需更改旧数组形状,但即使修改了旧数组元素,它们仍将具有相同的数据)。
例如:
>>>import numpy as np
>>>a = np.array([1,2,3,4])
>>>c = a.view()
>>>c
array([1,2,3,4])
c 是 a 的浅拷贝(它们引用相同的数据但不引用相同的对象):
>>>a is c
False
但是,如果我们将 c.base 测试为 a,它会给出 True:
>>>c.base is a
True
知道两者都是 ndarry 对象:
>>>type(a)
<class 'numpy.ndarray'>
>>> type(c)
<class 'numpy.ndarray'>
如果我们测试 a 和 c 的类型,我们会发现:
>>> type(a.base)
<class 'NoneType'>
>>> type(c.base)
<class 'numpy.ndarray'>
我的问题是:-
.base 属性到底是什么(它是 ndarray 对象中的数据部分)?
- 为什么 a 和 c 有不同类型的 .base?
解决方案
根据numpy 文档:
array.base
如果内存来自其他对象,则为基础对象。
如果对象拥有它的内存,则基为无,但如果一个对象与另一个对象共享内存(例如它的视图),则基将是该内存的所有者对象。在您的示例中,c.base
是拥有内存的对象,即a
.
推荐阅读
- laravel - 每个循环中是否有任何问题可以打破它而不是创建模型?
- python - 了解 FastText 多语言
- java - 从 RecyclerViewAdapter 启动 BottomSheet,该 RecyclerViewAdapter 与 onBindViewHolder 内的 RecyclerView.Adapter 一起扩展
- angular - 找不到模块:错误:无法解析“模块”
- java - pojo 对象类在 firebase 中插入重复值
- java - 如何处理h2数据库无法处理中断
- cakephp - 属于许多:保存自定义字段
- apache-kafka - 无法建立到节点 -1 的连接。经纪人可能不可用
- angular - 如何在考虑安全性的情况下处理 Angular 页面刷新
- ruby-on-rails - 设计和设计令牌身份验证 gem 路由错误