2016-10-05 3 views
0

Я работаю над скриптом Python, который принимает данные в прямом эфире и добавляет его в массив numpy. Однако я заметил, что если я добавляю к четырем различным массивам один за другим, он работает. Например:Append to Numpy Использование Loop

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 без каких-либо успехов. Однако, если я заменю слова 'array' в цикле for с именем массива, например say' closeBidArray', он работает отлично. Для записи цикл for находится внутри функции внутри класса, а массивы объявляются вне класса. – ng150716

+0

Я уточнил вопрос с дополнительной информацией по этому вопросу. – kindall