python - 对不存在的数组使用 numpy View

标签 python numpy view

定义带有零的数组 a 后,我可以使用以下函数创建最左边列的 View :

a = np.zeros((5, 5))
a_left_col = a[:, 0]

a_left_col[:] = 2.

打印a:

array([[2., 0., 0., 0., 0.],
       [2., 0., 0., 0., 0.],
       [2., 0., 0., 0., 0.],
       [2., 0., 0., 0., 0.],
       [2., 0., 0., 0., 0.]])

如果我随后重新初始化 a

a = np.zeros((5, 5))

那么 View 仍然存在,但它不再引用任何内容。如果我再次执行 a_left_col[:] = 2 ,Python 如何处理这种情况?这种未定义的行为是否像 C 或 C++ 中那样,或者 Python 是否正确处理它?如果是,为什么它不抛出错误?

最佳答案

原始对象仍然存在,因为它被 View 引用。 (尽管不能再通过变量a访问它。)

让我们详细看看对象的引用计数:

import sys
import numpy as np

a = np.zeros((5, 5))
print(sys.getrefcount(a))  # 2

a_left_col = a[:, 0]
print(sys.getrefcount(a))  # 3
print(sys.getrefcount(a_left_col.base))  # 3
print(a_left_col.base is a)  # True

a = np.ones((5, 5))
print(sys.getrefcount(a_left_col.base))  # 2

请注意,a_left_col.base 是对原始数组的引用。当我们重新评估 a 时,对象的引用计数减少,但它仍然存在,因为它可以通过 a_left_col 访问。

关于python - 对不存在的数组使用 numpy View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48445577/

相关文章:

python - 在 Python 中使用 EyeD3 设置 ID3 注释

python - 将映射数组应用于 numpy 数组中的所有元素的快速方法?

python-3.x - 查找 python 数组变为正数(但不是负数)的索引

python - SciPy 无法将复数转换为 float

asp.net-mvc-3 - 如何加载 Razor View 并动态渲染它?

python - 有没有办法在使用 pyinstaller 创建 exe 后录制视频

python - 如何通过使用确认的帐户创建功能将用户名和密码写入 csv (txt) 文件中的记录?

objective-c - 什么类型的代码正确 : addSubview or direct controller assignment in AppDelegate?

css - 如何在带有 borderRadius 的 View 组件中放置两个 View 组件?

python - 最高效的字典计数器