Как добавить значения в новый столбец после n строк? - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть этот цикл, который постоянно проверяет данные API и добавляет их в массив. Затем я рассчитываю индикатор на основе одного столбца массива, который я хочу добавить в массив. Проблема только в том, что для начала работы индикатора требуется 10 точек данных.

import numpy as np

list_b = []
i = 0

while True:
    i += 1
    list_a = [] 

    list_a.append(i)
    list_a.append(33)
    list_a.append(44)
    list_b.append(list_a)
    array = np.array(list_b, dtype=float)

    if len(array) > 10:
        x = indicator_function(array[:,0])
        np.append(x) # in a 4th column

    if i == 15:
        break

print(array.shape)
print(len(array))
print(array)

Проблема в том, что я не могу добавить массив, потому что он не имеет те же размеры, что и массив ранее. Итак, как я могу расширить массив на один столбец или вставить новые значения индикаторов в новый столбец после 10 строк.

Массив должен быть сформирован так:

1 33 44
2 33 44
...
9 33 44
10 33 44
11 33 44 x
12 33 44 x

Ответы [ 3 ]

0 голосов
/ 11 ноября 2018
if i < 10:   
    list_a.append(i)
    list_a.append(33)
    list_a.append(44)
    list_a.append(55)
    list_b.append(list_a)
    array = np.array(list_b, dtype=float)

if i > 10:
    list_a.append(i)
    list_a.append(33)
    list_a.append(44)
    list_a.append(66)
    list_b.append(list_a)
    array = np.array(list_b, dtype=float)

@ Сахил, да, это работает.

0 голосов
/ 11 ноября 2018

В numpy нет встроенной поддержки для правильных зубчатых массивов. Лучшая ставка для вашего приложения - это, вероятно, массив маски :

import itertools
import numpy.ma as ma

array = None
list_b = []

def indicator_function(arr):
    return -1

for i in itertools.count():
    list_a = []
    list_b.append(list_a)

    list_a.append(i)
    list_a.append(33)
    list_a.append(44)
    list_a.append(np.nan)
    array = ma.MaskedArray(list_b)

    # assign mask or indicator_function, as appropriate
    ix = 10 + 1
    array[:ix, -1] = ma.masked
    array[ix:, -1] = indicator_function(array[:,0])

    if i == 15:
        break

В результате получается array в маске, который выглядит следующим образом:

[[0.0, 33.0, 44.0, --],
 [1.0, 33.0, 44.0, --],
 [2.0, 33.0, 44.0, --],
 [3.0, 33.0, 44.0, --],
 [4.0, 33.0, 44.0, --],
 [5.0, 33.0, 44.0, --],
 [6.0, 33.0, 44.0, --],
 [7.0, 33.0, 44.0, --],
 [8.0, 33.0, 44.0, --],
 [9.0, 33.0, 44.0, --],
 [10.0, 33.0, 44.0, --],
 [11.0, 33.0, 44.0, -1.0],
 [12.0, 33.0, 44.0, -1.0],
 [13.0, 33.0, 44.0, -1.0],
 [14.0, 33.0, 44.0, -1.0],
 [15.0, 33.0, 44.0, -1.0]]
0 голосов
/ 11 ноября 2018

Насколько я понимаю, numpy не допускает зубчатые массивы (массивы с изменяющимся числом столбцов). Возможно, вам придется создать совершенно новый массив. Или, если вы хотите сделать что-то сумасшедшее, вы можете переместить оператор if выше list_b.append(list_a) и изменить его на

if (i > 10):
    x = indicator_function(array[:,0])
    list_a.append(x)
else:
    list_a.append(None)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...