【问题标题】:Set default value as numpy array将默认值设置为 numpy 数组
【发布时间】:2018-08-29 12:33:58
【问题描述】:

我有一个 MyClass 类,它存储一个整数 a。我想在其中定义一个函数,该函数采用长度为a 的numpy 数组x,但我希望如果用户没有传入任何内容,x 被设置为相同长度的随机数组。 (如果他们传入错误长度的值,我会引发错误)。基本上,我希望x 默认为大小为a 的随机数组。

这是我实现这个的尝试

import numpy as np 
class MyClass():
    def __init__(self, a):
        self.a = a
    def function(self, x = None):
        if x == None:
            x = np.random.rand(self.a)
        # do some more functiony stuff with x

如果没有传入任何内容,则此方法有效,但如果传入x,我会得到ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all(),即似乎numpy 不喜欢将数组与None 进行比较。

定义默认值 inline 不起作用,因为 self 尚未在范围内。

有没有很好的pythonic方法来实现这一点?总而言之,我希望参数 x 默认为具有特定类定义长度的随机数组。

【问题讨论】:

  • 该错误是由对数组执行== 测试引起的。这样的测试会产生一个相同大小的布尔数组。 if [True,False,True,False]: 有意义吗?幸运的是,在这种情况下,is None 是正确的选择。

标签: python arrays numpy default-value


【解决方案1】:

根据经验,任何事物与None 的比较都应使用is 而不是==

if x == None 更改为if x is None 可解决此问题。

class MyClass():
    def __init__(self, a):
        self.a = a

    def function(self, x=None, y=None):
        if x is None:
            x = np.random.rand(self.a)
        print(x)

MyClass(2).function(np.array([1, 2]))
MyClass(2).function()
#  [1 2]
#  [ 0.92032119  0.71054885]

【讨论】:

  • 这实际上是 Python 鼓励使用 is None 而不是 == None 的关键原因之一,但是每当人们回答“为什么我们应该使用是 None”的问题时,我忘记了——我的意思是那些人忘记了——而是专注于最初的原因和各种不太重要的事情……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
相关资源
最近更新 更多