列出当前Python解释器中所有已知的NumPy数组
我想要一个当前由Python解释器管理的所有numpy数组的集合。以前的回答建议,列出当前Python解释器中所有已知的NumPy数组,python,numpy,garbage-collection,Python,Numpy,Garbage Collection,我想要一个当前由Python解释器管理的所有numpy数组的集合。以前的回答建议,gc.get\u objects()应该为我这样做。但是,我没有得到预期的结果: In [1]: import numpy as np In [2]: import gc In [3]: x = np.ones(5) In [4]: any(item is x for item in gc.get_objects()) Out[4]: False 有没有办法获得当前实例化的所有已知NumPy数组(或任何类型
gc.get\u objects()
应该为我这样做。但是,我没有得到预期的结果:
In [1]: import numpy as np
In [2]: import gc
In [3]: x = np.ones(5)
In [4]: any(item is x for item in gc.get_objects())
Out[4]: False
有没有办法获得当前实例化的所有已知NumPy数组(或任何类型的对象)?我不确定这是否解决了您试图解决的确切问题,但是使用
locals()
怎么样?这至少让您开始了解当前交互会话的解释器正在跟踪哪些变量
import numpy as np
a = np.array([1, 2, 3])
b = np.array([2, 3, 4])
filter(lambda x : isinstance(x, np.ndarray), locals().values())
这不是一个完美的答案,但根据您的经验,您可以使用它来获取所有局部声明变量的字典 然后,您可以使用简单的dict理解获得所有已知的NumPy数组:
import numpy as np
np_arrays = {k:v for k,v in locals().items() if isinstance(v, np.ndarray)}
然后,您可以在字典上随意迭代。如前所述,如果递归展开对象,您可以使用
gc.get_objects()
找到numpy数组
现在我们应该可以找到物体了
我相信局部变量只提供局部作用域,而不是分配到别处的变量。我相信局部变量只提供局部作用域,而不是分配到别处的变量。事实上,这不会揭示分配给对象类成员的项。仅供参考,来自Continuum Analytics的Jim Crist内部通信:这解释了gc.get_对象不起作用的原因:Numpy包含一个作为上下文管理器跟踪分配的工具。这加上一个
WeakSet
可能有助于解决您的问题。
# code from https://utcc.utoronto.ca/~cks/space/blog/python/GetAllObjects
import gc
# Recursively expand slist's objects
# into olist, using seen to track
# already processed objects.
def _getr(slist, olist, seen):
for e in slist:
if id(e) in seen:
continue
seen[id(e)] = None
olist.append(e)
tl = gc.get_referents(e)
if tl:
_getr(tl, olist, seen)
# The public function.
def get_all_objects():
"""Return a list of all live Python
objects, not including the list itself."""
gcl = gc.get_objects()
olist = []
seen = {}
# Just in case:
seen[id(gcl)] = None
seen[id(olist)] = None
seen[id(seen)] = None
# _getr does the real work.
_getr(gcl, olist, seen)
return olist
import numpy as np
import gc
x = np.ones(5)
objects = get_all_objects()
print(any([obj is x for obj in objects]))
# will return True, the np.ndarray is found!