Вычисление нового столбца с использованием NumPy для цикла - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть набор данных с именем np_charge в numpy размером (1430, 258). Моя идея состоит в том, чтобы создать новый столбец, в котором первая строка содержит вывод уравнения

первая строка: np_charge [-1] [1] -np_charge [0] [1]

вторая строка: np_charge [-1] [1] -np_charge [1] [1] , , .

последняя строка: np_charge [-1] [1] -np_charge [1429] [1]

Я пытался найти решения в интернете, но не смог их найти. Мое решение выглядит так:

e=[]

n_rows=np_charge.shape[0]-1

for i in range(n_rows):
    e[i]=(np_charge[-1][1]-np_charge[i][1])

Но я получаю этот код ошибки:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-988-9463a5cb0618> in <module>()
 15 
 16 for i in range(n_rows):
---> 17     e[i]=np_charge[-1][1]-np_charge[i][1]
 18 
 19 

IndexError: list assignment index out of range

Спасибо, R

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Как уточняется вами в одном из ваших комментариев.Создание MVE

from datetime import datetime
from dateutil.relativedelta import relativedelta
import random
a=np.array([datetime.now()-relativedelta(months=random.randint(0,100)) for i in range(10)])
print(a)

Вывод:

 array([datetime.datetime(2014, 10, 12, 9, 0, 31, 696000),
           datetime.datetime(2018, 9, 12, 9, 0, 31, 696000),
           datetime.datetime(2014, 4, 12, 9, 0, 31, 696000),
           datetime.datetime(2011, 4, 12, 9, 0, 31, 696000),
           datetime.datetime(2015, 10, 12, 9, 0, 31, 696000),
           datetime.datetime(2011, 11, 12, 9, 0, 31, 696000),
           datetime.datetime(2016, 3, 12, 9, 0, 31, 696000),
           datetime.datetime(2017, 10, 12, 9, 0, 31, 696000),
           datetime.datetime(2010, 6, 12, 9, 0, 31, 696000),
           datetime.datetime(2016, 2, 12, 9, 0, 31, 696000)], dtype=object)

tn Я предполагаю последний индекс массива.Поэтому

result=a[len(a)-1]-a

[datetime.timedelta(488),
 datetime.timedelta(-943),
 datetime.timedelta(671),
 datetime.timedelta(1767),
 datetime.timedelta(123),
 datetime.timedelta(1553),
 datetime.timedelta(-29),
 datetime.timedelta(-608),
 datetime.timedelta(2071),
 datetime.timedelta(0)]
0 голосов
/ 12 сентября 2018

Для цикла не рекомендуется. Numpy оптимизирован для выполнения операций с массивами. Быстрый пример:

L = np.random.randint(0, 5, size=(20, 10))
new = L[-1][1]-L[:][1]
Out[61]: array([-3,  0, -3,  0,  1, -1,  0,  1, -3, -2])

Так что в вашем случае новый столбец будет таким же, но с np_charge вместо L.

N.B: Ваша ошибка происходит из-за того, что вы не используете append() метод вашего списка e. Первая итерация, вы ищите индекс 0 в списке [], который не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...