生成器仅用最终项的副本填充列表

2024-03-28 23:02:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python将用于创建Halton sequencemethod转换为generator。我在Python2.7和Python3.3中遇到了同样的问题。你知道吗

当我使用生成器创建一个生成器对象并反复调用my_object.next()时,我得到了预期的结果。然而,当我调用list(my_object)tuple(my_object)时,我得到大小适当的列表/元组,但每个元素只是生成器输出的最终值的一个副本。我的Python 3.3代码如下:

def halton_gen(dim, num_pts):
    sequence = np.empty(dim)
    sequence.fill(np.nan)
    primes = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31)  # first 11 prime #s
    log_pts = log(num_pts + 1)
    k = 1

    # Generate the sequence
    while k <= num_pts:
        print("k = {}".format(k))
        for i in range(dim):
            print("i = {}".format(i))
            prime = primes[i]
            num_helper = int(ceil(log_pts / log(prime)))

            kk = k
            sum_ = 0

            for j in range(num_helper):
                sum_ += fmod(kk, prime) * pow(prime, -(j + 1))
                kk = floor(kk / prime)

            sequence[i] = sum_

        print("sequence {}".format(sequence))
        yield sequence
        k += 1

注意,上面代码中的print语句给出了我所期望的结果,但是用list(my_object)tuple(my_object)创建的列表/元组是不正确的:

my_object = halton_gen(2, 5)    
tuple(my_object)

k = 1
i = 0
i = 1
sequence [ 0.5         0.33333333]
k = 2
i = 0
i = 1
sequence [ 0.25        0.66666667]
k = 3
i = 0
i = 1
sequence [ 0.75        0.11111111]
k = 4
i = 0
i = 1
sequence [ 0.125       0.44444444]
k = 5
i = 0
i = 1
sequence [ 0.625       0.77777778]

Out[86]:
(array([ 0.625     ,  0.77777778]),
 array([ 0.625     ,  0.77777778]),
 array([ 0.625     ,  0.77777778]),
 array([ 0.625     ,  0.77777778]),
 array([ 0.625     ,  0.77777778]))

我期望(删除array()说明符以提高可读性):

([0.5    0.333],
 [0.25   0.667],
 [0.75   0.111],
 [0.125  0.444],
 [0.625  0.778])

如何让生成器正确填充列表?或者我的清单,以正确地打开我的发电机?不管用什么恰当的方式来表达。你知道吗


Tags: logformat列表objectmyarrayprimenum
1条回答
网友
1楼 · 发布于 2024-03-28 23:02:17

正在回收您的sequence对象。一个解决办法是每次你屈服时重新创造它。你知道吗

def halton_gen(dim, num_pts):
    primes = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31)  # first 11 prime #s
    log_pts = log(num_pts + 1)
    k = 1

    # Generate the sequence
    while k <= num_pts:
        sequence = np.empty(dim)
        sequence.fill(np.nan)
        print("k = {}".format(k))
        for i in range(dim):
            print("i = {}".format(i))
            prime = primes[i]
            num_helper = int(ceil(log_pts / log(prime)))

            kk = k
            sum_ = 0

            for j in range(num_helper):
                sum_ += fmod(kk, prime) * pow(prime, -(j + 1))
                kk = floor(kk / prime)

            sequence[i] = sum_

        print("sequence {}".format(sequence))
        yield sequence
        k += 1

另一个修复方法是如注释所述,使用sequence.copy()。你知道吗

    yield sequence.copy()

相关问题 更多 >