【问题标题】:Check if variable is None or numpy.array检查变量是 None 还是 numpy.array
【发布时间】:2016-09-19 07:18:26
【问题描述】:

如果键有关联的数组,我会在表中查找。按照设计,我的table.__getitem__() 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() or table[w.lower()].any(),那么如果不匹配,我可能会遇到:

AttributeError: 'NoneType' object has no attribute 'any'

我一定是错过了正确的方法,怎么办?

【问题讨论】:

  • this other question 的明显转贴,因为那里的正确答案不能满足我的需要。如果可能的话,我想要一个比if table[w] is not None: ... elif table[w.lower()] is not None: ... else 更短的方法。
  • @Goyo: 如果a 是一个数组,v = a or b 会引发ValueError(如果aNone 并且b 是一个数组,则不会)
  • a = None .... isinstance(a, (type(None))) # True .... 如果 a 是其他值,它将返回 false。显然只对 None 之间的分支有用,如果你能保证 'a' 将是数组的某种化身
  • @Nikana 你的问题不清楚。 “我希望这个值是 None...” 你什么时候希望它是 None? “或与w 关联的numpy 数组” 关联数组是什么? table[w]? table[w.lower()]?您遇到的错误是意料之中的,但我不明白您想要实现什么。
  • @Goyo:如果表在 w 上没有返回值,而在 w.lower() 上没有返回值,我希望值为 None。否则,成为第一个非无值(所以是的,理想情况下,table[w])。

标签: python numpy


【解决方案1】:
if type(value) is numpy.ndarray:
    #do numpy things
else
    # Handle None

虽然上述方法可行,但我建议保持签名简单且一致,即 table[w] 应始终返回 numpy 数组。如果为 None,则返回空数组。

【讨论】:

  • 那么我有一个这样的 w 块和另一个 w.lower() 块吗?这很冗长,不是吗?
【解决方案2】:

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

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()]

【讨论】:

  • 对不起,但这与问题无关。问题是关于value = ??? 部分。
  • 这与您接受的答案相同,只是更明确。问题是您无法检查数组是否 == None(您观察到的错误)。但是你可以使用我上面展示的 is 实例。我编辑了上面的评论。
  • 我可以检查value == None是否是公认的答案。我会喜欢的是一个单行,它分配[table[w], table[w.lower()]] 中的第一个非无值(如果有),否则为无。接受的答案在 3 行中完美地做到了这一点。我不明白你的贡献。
  • 在这种情况下使用 is 有效,但使用 == 会抛出您在上面看到的 ValueError。好的 Python 代码是明确的。我正在向您展示如何测试 value 是否是一个数组,而不是如果它是 None ......这是更好的 Python 代码。如果这仍然难以理解,我建议您参考 Python 之禅。
【解决方案3】:

IIUC 这应该可以工作:

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

【讨论】:

    【解决方案4】:

    使用dict.get

    如果键在字典中,则返回键的值,否则返回默认值。如果未给出默认值,则默认为 None,因此此方法永远不会引发 KeyError。

    value = table.get(w, table.get(w.lower()))
    

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

    【讨论】:

    • 哦,有趣。虽然......如果默认值为 None 会发生什么,它会失败还是接受它?如果第一个确实返回了某些东西,即 None ,为什么它会默认为默认值?
    • @NikanaReklawyks Python 中的每个函数都隐式返回 None,如果没有指定其他内容:默认值是第一个返回 None 时分配的值
    • 请注意,OP 提到他们的__getitem__ 实现不会总是引发KeyErrortable.get(w.lower()) 也不会被懒惰地评估。
    • OP 说它 sometimes 返回 None 而不是 KeyError 所以我假设 table 只是一个普通的 dict 填充 numpy 数组和 Nones .但是关于懒惰的好处。
    猜你喜欢
    • 2016-08-15
    • 2018-01-04
    • 2014-03-19
    • 2019-12-24
    • 2020-01-30
    • 2021-03-17
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多