2016-10-05 43 views
0

我正在研究一个需要直播流数据并将其附加到numpy数组的Python脚本。但我注意到,如果我追加到四个不同的数组一个接一个它的作品。例如:使用For循环附加到Numpy

openBidArray = np.append(openBidArray, bidPrice) 
highBidArray = np.append(highBidArray, bidPrice) 
lowBidArray = np.append(lowBidArray, bidPrice) 
closeBidArray = np.append(closeBidArray, bidPrice) 

但如果我这样做这是行不通的:

arrays = ["openBidArray", "highBidArray", "lowBidArray", "closeBidArray"] 

for array in arrays: 
    array = np.append(array, bidPrice) 

为什么这是任何想法?

+0

'array = ...'在循环中重新分配迭代变量,但不会更改源列表中的值。你必须使用索引循环来做'array [i] = ...'。这是基本的Python循环行为。 – hpaulj

回答

1

在你的第二个例子中,你有字符串,而不是np.array对象。您正试图将一个数字(?)附加到一个字符串中。

字符串“openBidArray”不包含任何指向openBidArray的数组的链接。

2

而是执行此操作:

arrays = [openBidArray, highBidArray, lowBidArray, closeBidArray] 

换句话说,你的名单应该是阵列的列表,而不是巧合包含你碰巧定义数组名称的字符串列表。

您的下一个问题是,np.append()返回数组的一个副本,附加了项目,而不是附加到位。您将此结果存储在array中,但array将在下一次迭代中从列表中分配下一项,并且修改后的阵列将会丢失(除了最后一个,当然这将在array末尾循环)。所以你需要将每个修改后的数组存回列表中。要做到这一点,你需要知道它来自哪个插槽,你可以使用enumerate()

for i, array in enumerate(arrays): 
    arrays[i] = np.append(array, bidPrice) 

当然,这当然不会更新您的原始变量,openBidArray等等。你可以通过拆包循环之后:

openBidArray, highBidArray, lowBidArray, closeBidArray = arrays 

但在某些时候,它只是使更多的开始与意义存储在列表中的阵列(或字典,如果你需要通过名称来访问它们)和不使用单独的变量。

N.B.如果您在此使用常规Python列表而不是NumPy数组,则其中一些问题会消失。列表上的append()是一个就地操作,因此您不必将修改后的数组存储回列表或解压缩到各个变量。如果你真的需要NumPy功能,那么完成所有附加列表并将它们转换为数组可能是可行的。

+0

谢谢,我不知道为什么我用字符串开头。但是我用数组名替换它们,并且仍然没有成功地运行for循环。但是,如果我将for循环中的'array'替换为数组名称,比如说'closeBidArray',它就可以工作。对于记录而言,for循环位于类内的函数内部,并且数组在类之外声明。 – ng150716

+0

我已更新此问题的更多信息。 – kindall