在不创建列表的情况下填写numpy数组

时间:2015-04-28 09:05:34

标签: python arrays list numpy

我想创建一个numpy数组而不先创建一个列表。
目前我已经得到了这个:

import pandas as pd
import numpy as np 

dfa = pd.read_csv('csva.csv')
dfb = pd.read_csv('csvb.csv')

pa = np.array(dfa['location'])
pb = np.array(dfb['location'])

ra = [(pa[i+1] - pa[i]) / float(pa[i]) for i in range(9999)]
rb = [(pb[i+1] - pb[i]) / float(pb[i]) for i in range(9999)]

ra = np.array(ra)
rb = np.array(rb)

有没有一种优雅的方法可以一步完成这个np数组的最后一次填充而不先创建列表?

谢谢

3 个答案:

答案 0 :(得分:3)

您可以使用numpy中的向量进行计算,而无需使用列表:

ra = (pa[1:] - pa[:-1]) / pa[:-1]
rb = (pb[1:] - pb[:-1]) / pb[:-1]

答案 1 :(得分:2)

你问题的标题以及你在特定情况下需要做的事实上实际上是两个截然不同的事情。

创建一个没有"铸造"的numpy数组;一个列表(或其他可迭代的)你可以使用numpy本身定义的几个返回数组的方法之一:

  • np.emptynp.zerosnp.onesnp.full创建具有固定值的给定大小的数组
  • np.random.*(其中*可以是各种分布,如正常,统一,指数......),以随机值创建给定大小的数组

一般情况下,请阅读:Array creation routines

在你的情况下,你已经有了numpy数组(papb),你不必创建列表来计算新数组({ {1}}和ra),你可以直接操作numpy数组(这是numpy的整个点:你可以更快地对数组进行操作,迭代每个元素!)。复制自@Daniel's answer

rb

这比你当前的实现快得多,不仅因为你避免将列表转换为ndarray,而且因为numpy数组比数学和批处理操作更快。迭代

答案 2 :(得分:0)

  

numpy.zeros

     

返回一个给定形状和类型的新数组,用零填充。

  

numpy.ones

     

返回一个给定形状和类型的新数组,其中包含一个。

  

numpy.empty

     

返回给定形状和类型的新数组,而不进行初始化   条目。