我一直在用Python和Numpy对一个随机过程进行建模,并用以下代码见证了奇怪的行为:
import numpy as np
class Example( object ):
def __init__( self ):
self.x = 0
def add_random( self ):
self.x += np.random.randn(1)
return self.x
if __name__ == '__main__':
example = Example()
state = []
for x in range(10):
state.append( example.add_random() )
print state
这将返回一个由10个相同的随机数组成的数组,而不是预期的10个不同的随机数。消除object.__iadd__
运算符和/或用常量替换np.random.randn(.)
将解决此问题。有人知道这是怎么回事吗?你知道吗
np.random.randn(1)
返回包含单个元素的数组:第一次执行此行时
self.x
最初,Python整数被numpy数组替换。该行的后续执行修改x
就地,因为numpy数组就是这样实现就地加法的。所以return self.x
总是返回相同的数组。因此,您在main部分中创建的列表是一个包含重复10次的相同对象的列表。你知道吗解决这个问题的一种方法是使用
np.random.randn()
而不是np.random.randn(1)
。np.random.randn()
返回一个标量,因此赋值self.x += np.random.randn(1)
每次执行时都会创建一个新的self.x
对象。你知道吗通过引用返回数组
self.x
,因此有10个指向同一数组的指针。每次修改数组时,所有十个指针都指向相同的修改版本。你知道吗如果每次都要返回数组的单独副本,可以在
add_random
函数中return self.x.copy()
。你知道吗另一种解决方法是用
np.random.rand()
替换np.random.rand(1)
,这样self.x
将保持标量而不是向上转换为数组。你知道吗相关问题 更多 >
编程相关推荐