列出当前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数组(或任何类型

我想要一个当前由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数组(或任何类型的对象)?

我不确定这是否解决了您试图解决的确切问题,但是使用
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!