numpy,在循环中选择连接还是初始化

2024-04-25 00:08:50 发布

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

我有几个数组要初始化。我想循环遍历每个数组,这样数组就不包含任何数据,它可以通过某种方法进行初始化,但如果它确实包含数据,则会通过numpy.stack向它添加新的数据。我试过这个:

a = np.array(0)
b = np.array(0)
c = np.array(0)

while True:

    data_set_num = infile.readline()
    if not data_set_num: break

    for arr in (a, b, c):
        new_arr = get_new_array(infile)
        try:
            arr = np.stack((arr, new_arr))
        except:
            arr = np.array(new_arr)

但在循环执行之后,我什么都没有:

>>> a.shape
()

bc相同。显然我不明白arr是如何引用这三个数组的。有人知道我要做什么吗?当然,我可以展开内部循环,但这看起来非常“不和谐”。你知道吗


Tags: 数据方法numpytruenewdatastacknp
2条回答

除非通过堆叠连接数组是一种糟糕的方法,否则您可能需要修复代码中的名称绑定问题。你知道吗

问题是arr一个接一个地引用(绑定到)数组(正如您所期望的那样)。然后它被np.stack((arr, new_arr))np.array(new_arr)替换,这两个都返回新的数组。名称arr绑定到新引用,而不是abc。你知道吗

一个直接的解决方案是创建数组列表,而不是使用abc。像这样做

x = [np.array(0) for _ in range(3)]

while True:

    data_set_num = infile.readline()
    if not data_set_num:
        break

    for ind, arr in enumerate(x):
        new_arr = get_new_array(infile)
        try:
            x[ind] = np.stack((arr, new_arr))
        except:
            x[ind] = np.array(new_arr)

这里有几个主要的缺陷。首先,您不应该将try...except用于如此简单的事情。另一方面,如果必须将数组堆叠在一起,请尝试一次完成所有操作,而不是进行增量重新分配。你知道吗

而且,您的代码似乎在while True:循环中一次又一次地在同一组数组上循环。你知道吗

import numpy as np
arrays = []
while True:
    #data_set_num = infile.readline()
    #if not data_set_num: break
    arr = np.array(0)
    for count in range(3):
        #new_arr = get_new_array(infile)
        new_arr = np.array([[count+1,count+2],[count+3,count+4]])
        try:
            arrays.append(np.stack((arr, new_arr)))
        except:
            arrays.append(np.array(new_arr))
    break
print str(arrays[0])
print str(arrays[1])
print str(arrays[2])

相关问题 更多 >