Python 检查变量是否为None或numpy.array

Python 检查变量是否为None或numpy.array,python,numpy,Python,Numpy,我在表中查找键是否有关联的数组。根据设计,我的表。somtimes返回None,而不是KeyError-s。我希望此值为None,或与w关联的numpy数组 value = table[w] or table[w.lower()] # value should be a numpy array, or None if value is not None: stack = np.vstack((stack, value)) 只有使用上述代码,并且第一次查找是匹配的,我才能得到: Valu

我在表中查找键是否有关联的数组。根据设计,我的
表。
somtimes返回
None
,而不是
KeyError
-s。我希望此值为
None
,或与
w
关联的numpy数组

value = table[w] or table[w.lower()]
# value should be a numpy array, or None
if value is not None:
    stack = np.vstack((stack, value))
只有使用上述代码,并且第一次查找是匹配的,我才能得到:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
如果我使用
value=table[w].any()或table[w.lower()].any()
,那么如果是不匹配的,我预期会遇到:

AttributeError: 'NoneType' object has no attribute 'any'
我一定错过了正确的方法,怎么做?

使用

如果键在字典中,则返回键的值,否则为默认值。如果未给出default,则默认为None,这样该方法就不会引发keyrerror

因此,如果
table[w]
不存在,您将得到
table[w.lower()]
,如果不存在,您将得到
None

if type(value) is numpy.ndarray:
    #do numpy things
else
    # Handle None
尽管上述方法可行,但我建议保持签名的简单性和一致性,即表[w]应始终返回numpy数组。如果无,则返回空数组

IIUC这应该有效:

value = table[w]
if value is None:
    value = table[w.lower()]

这个问题已经得到了回答,但是其他遇到这个错误的人可能需要一个通用的解决方案。有了明确的想法,我们可以使用函数。下面是一个工作示例

import numpy as np

a = np.array([1,2,3])
b = None
for itm in [a,b]:
    isinstance(itm,np.ndarray)
所以在这个问题的背景下

value = table[w]
if not isinstance(value,np.ndarray):
    value = table[w.lower()]

明显的转载,因为那里的正确答案不能满足我的需要。如果表[w]不是None,我希望使用比
更短的方法:。。。elif表[w.lower()]不是无:。。。else
,如果可能的话。@Goyo:
v=a或b
如果
a
是数组(如果
a
None
b
是数组,则不会引发
ValueError
)a=None。。。。isinstance(a,(type(None))#True。。。。如果a是其他值,它将返回false。显然,只有在“无”和“如果你能保证“a”将是“a”的某种化身”之间进行分支才有用array@Nikana你的问题不清楚。“我希望此值为
None
…”您希望何时为None?“或与
w
关联的numpy数组”关联的数组是什么<代码>表[w]<代码>表格[w.lower()]?您得到的错误是意料之中的,但我不明白您想要实现什么。@Goyo:如果table在w上返回None,在w上返回None,我希望value为None。lower()。否则,作为第一个非None值(是的,理想情况下,表[w])。噢,很有趣。虽然。。。如果默认值为None,会发生什么情况?它会失败还是接受它?如果第一个确实返回了一些东西,为什么它会默认为默认值,例如,None?@NikanaReklawyks如果没有指定其他内容,Python中的每个函数都会隐式返回
None
:默认值是第一个函数返回
None
时所分配的值。请注意,OP提到了它们的
\uu getitem\uuuuuuuuuuuuuuuuuu>实现不会总是引发
键错误。另外,
table.get(w.lower())
不会被懒散地计算。OP说它有时返回
None
而不是
KeyError
,所以我假设
table
只是一个正常的
dict
填充了numpy数组和
None
s。但是关于懒惰有一个很好的观点。那么我是否有一个这样的块与w和另一个块与w.lower()?这太冗长了,不是吗?对不起,这和问题没什么关系。问题是关于
值=???
部分。这与您接受的答案相同,只是更加明确。问题是您无法检查数组==None(您观察到的错误)。但是你可以使用我上面展示的is实例。我编辑了上面的评论。我可以检查
value==None
,这就是被接受的答案。我喜欢的是一个单行程序,它分配
[table[w],table[w.lower()]
中的第一个非None值(如果有的话),或者不分配。公认的答案完美地做到了这一点,有三行。我不理解您的贡献。在这种情况下,使用
is
有效,但使用==会抛出您在上面看到的ValueError。好的Python代码是显式的。我向您展示了如何测试值是否为数组,而不是它是否为None。。。哪个是更好的Python代码。如果这仍然很难理解,我建议您参考Python的禅宗。
value = table[w]
if not isinstance(value,np.ndarray):
    value = table[w.lower()]