使用for循环计算numpy的新列

问题描述 投票:1回答:2

我在numpy中有一个名为np_charge的数据集,大小为(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

python numpy for-loop multiple-columns
2个回答
0
投票

不建议使用循环。 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,该索引不存在。


0
投票

正如您在其中一条评论中所阐明的那样。创建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)

我假设数组的最后一个索引。因此

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)]
© www.soinside.com 2019 - 2024. All rights reserved.