如何检查是否已经存在numpy数组?

8
我想知道在代码中是否已经定义了某个数组。类似于a.exist(),如果存在则返回True,否则返回False。
我尝试过a.size:,但如果数组还不存在,则会出现错误消息,我希望避免这种情况。
如果你想知道,这种情况发生在一个循环中。

1
你可以将其包装在 try except 范围内。 - Anton Protopopov
if a: 或者 if "a" in vars(): 怎么样? - Hugh Bothwell
2
你怎么不知道定义是什么?听起来很像你的逻辑有问题。 - Padraic Cunningham
可能有这样一种情况,您有一个队列,不断接收numpy数组,只有在弹出空元素时才想要继续进行。 - user1603472
5个回答

9

你需要使用try/except块:

try:
    _ = a.shape
except NameError:
    print('a does not exist.')
except AttributeError:
    print('a does not have a shape property.')

正如@padraic所指出的那样,这种情况实际上不应该发生。最好初始化您的变量(例如a = None),然后检查它们是否已设置(例如if a: print('a is set') else: print('a has not been set'))。


1
完美。但是,正如指出的那样,我认为我会重写我的代码,以便在第一时间就不会发生这种情况。 - user4770892
3
问题在于,如果您在写代码时使用 if a:,其中 a 是一个数组,它会尝试评估 a 中的所有条目,并返回错误:ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()。请使用 a.any()a.all() 来解决该问题。注意,不要改变原始含义。 - Aku
4
那只是一个例子,不是特定情况。可能会将默认值设置为“None”,然后测试“if a is not None”。 - Alexander

6

Python有一些内置函数,可以检查变量是否在当前/本地/全局作用域中分配。

例如,要检查变量是否在当前本地作用域中定义,请使用:

if 'a' in dir():
    # Variable a is defined.
    if hasattr(a, 'shape'):
        # Probably a numpy array, at least it has a shape.

但这不是良好的 Python 编码方式,try/except 更加常见。为了完整起见,我认为值得提一下,你可以在没有任何 try/except 语句的情况下实现。

if 'a' in dir():
    print('yes')
else:
    print('no')
# prints 'no' because we haven't defined any variable a

a = np.array([1,2,3])
if 'a' in dir():
    print('yes')
else:
    print('no')
# prints 'yes' because I defined it

del a
if 'a' in dir():
    print('yes')
else:
    print('no')
# prints 'no' because I deleted the variable again

值得一提的是,localsglobals 也很重要。

5

如果您想确保a是一个numpy数组,而不是任何其他可能具有size变量或方法的类型,您可以在try块中检查包含的类型以处理异常情况,以防该变量未定义。这样,只有在a存在且是numpy数组时才会继续执行。

import numpy as np
a = np.array([1,2])
try:
    if isinstance(b,np.ndarray):
        print("TRUE")
except NameError:
    print("FALSE")

2
使用try/except NameError包装器是良好的Python编程习惯。但在使用之前将变量初始化为有用的值同样好。我认为速度上没有太大差别,但代码更易读。
例如:
for i in range(5):
    a += 4

会产生一个空格。
NameError: name 'a' is not defined

可以用以下方式捕获:

for i in range(5):
    try:
        a += 4
    except NameError:
        a = np.arange(5)

但是我之前可以定义a。如果我事先不知道a的第一个值应该是什么,那么None是一个方便的值:

a=None
for i in range(5):
   if a is None:
       a=np.arange(5)
   a += 4

另一个常见的 numpy 实践是从一个空列表开始,并在其中累积值。

a = []
for i in range(5):
    a.append(np.ones(4)*i)
a = np.array(a)

0
短语“is not None”是一个很好的用来确定数组存在与否的通用方法。
if (a is not None):
    #Do something if it exists
else:
    #Do something if it does not exist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接