2015-04-28 77 views
2

我想先創建一個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陣列的不首先創建列表?

由於

+0

幾個步驟可能會有所幫助1)發佈原始數據2)預期輸出。 – Zero

+0

你也可以在np.array(dfa ['location'])中使用'dfa ['location']。values'' – Zero

+0

想問同樣的問題,但我現在看到沒有一般的答案。 – Ch3shire

回答

3

您可以在numpy的向量計算,而無需名單:

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

numpy.zeros

返回給定的形狀和類型的一個新的數組,用零填充。

numpy.ones

返回給定的形狀和類型的新陣列,填充有的。

numpy.empty

返回給定的形狀和類型的一個新的數組,而不初始化 條目。

2

你的問題,你需要在特定情況下做什麼其實是兩個不同的性能稍微事物的標題。

要創建無「鑄造」列表一個numpy的陣列(或其他迭代),可以使用通過numpy的本身,它返回數組定義的幾種方法之一:

  • np.emptynp.zerosnp.onesnp.full創建給定大小的陣列具有固定值
  • np.random.*(其中*可以是各種分佈,像正常的,均勻的,指數...),以創建給定尺寸的陣列,隨機值

一般來說,閱讀:Array creation routines

在你的情況,你已經numpy的陣列(papb),你不必創建列表來計算新陣列(rarb ),你可以直接在numpy數組上進行操作(這是numpy的全部要點:你可以更快地對數組進行操作,這將會迭代每個元素!)。從@Daniel's answer複製:

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

這將是快得多比你目前的實現,不僅是因爲你避免轉換列表ndarray,但由於numpy的陣列magnuitude的順序更快的數學和批量操作比迭代式

相關問題