python - 为什么 arr.flat.base 与 a.ravel().base 不同?
问题描述
我试图深入了解 Numpy 在内部的工作方式,但我对一些关于base
数组展平的事情感到困惑。
import numpy as np
a = np.arange(12, dtype=int).reshape((3, 4))
所以,我们有这个简单的数组。然后我尝试使用flat
and ravel()
:
flat_iter = a.flat
print(flat_iter.base is a)
这会打印 me True
,这正是我所期待的。
a_ravel = a.ravel()
print(a_ravel.base is a)
但是,这给了我False
. 为什么?
flat_iter.base
似乎对应于重新整形的数组a
,即np.arange(12, dtype=int).reshape((3, 4))
。不过,a_ravel.base
似乎对应np.arange(12, dtype=int)
。
我试图用谷歌搜索它,但我真的不明白为什么会发生这种情况。为什么base
两者之间的行为会有所不同?
解决方案
In [82]: a = np.arange(5)
In [83]: b = a.reshape(5,1)
In [84]: c = b.ravel()
In [85]: biter=b.flat
现在检查数据缓冲区位置:
In [86]: a.__array_interface__['data']
Out[86]: (44761168, False)
In [87]: b.__array_interface__['data']
Out[87]: (44761168, False)
In [88]: c.__array_interface__['data']
Out[88]: (44761168, False)
都一样,b
都是c
意见。但:
In [89]: biter.__array_interface__['data']
Traceback (most recent call last):
File "<ipython-input-89-9d5e2ed1a08d>", line 1, in <module>
biter.__array_interface__['data']
AttributeError: 'numpy.flatiter' object has no attribute '__array_interface__'
flatiter
不是数组!
In [90]: a.base # None
In [91]: b.base
Out[91]: array([0, 1, 2, 3, 4])
In [92]: b.base is a
Out[92]: True
In [93]: c.base is a
Out[93]: True
正如预期的那样, theb
和c
base 都是a
.
但b.flat
基础是b
:
In [94]: biter.base
Out[94]:
array([[0],
[1],
[2],
[3],
[4]])
In [95]: biter.base is b
Out[95]: True
In [96]: biter.base is a # not a
Out[96]: False
再次biter
不是一个数组,所以不“服从”相同的base
逻辑。
不管base
, 修改biter
修饰b
和a
(and c
):
In [97]: biter[::2] = 10
In [98]: b
Out[98]:
array([[10],
[ 1],
[10],
[ 3],
[10]])
In [99]: a
Out[99]: array([10, 1, 10, 3, 10])
所以简短的回答是,flatiter
基地与基地view's
不同。
推荐阅读
- r - 当因子级别只有一个级别时,将 predict() 与 RcppArmadillo/RcppEigen 一起使用
- python - 回调 AgnosticLatentCommandCursor 中的异常
- java - 在 java 11 上安装 JDBC
- r - 我如何从“第 1 周”中删除“周”这个词,以便我只保留数字 1
- macos - 无法使用 macports 模块在 mac 上安装 jq
- python - 无法从 django 中的表中编辑数据
- excel - 从活动工作簿创建一种临时工作簿,然后保存临时工作簿。wb 没有改变行为。wb.. Excel VBA
- r - 如何按月计算数据集中所有年份的百分比偏差
- angular - 角度通用 SSR 动态绝对基准路径
- c# - 将列表对象中的项目附加并返回到对象列表中的字符串数组中