【问题标题】:Calculating a new column with numpy using for loop使用 for 循环计算带有 numpy 的新列
【发布时间】:2018-09-12 12:36:09
【问题描述】:

我在 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

谢谢, 回复

【问题讨论】:

    标签: python numpy for-loop multiple-columns


    【解决方案1】:

    不推荐使用 For 循环。 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:您的错误来自您没有使用列表eappend() 方法。第一次迭代,在列表[] 中查找索引0,该索引不存在。

    【讨论】:

      【解决方案2】:

      正如您在您的一个 cmets 中所阐明的那样。创建 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)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-26
        • 2019-08-22
        • 1970-01-01
        • 2017-06-14
        • 1970-01-01
        • 1970-01-01
        • 2017-05-21
        • 1970-01-01
        相关资源
        最近更新 更多