簡體   English   中英

將許多列表轉換為具有預定義數據類型的單個 np 數組的最快方法

[英]Fastest way to turn many lists into single np array with predefined datatypes

有沒有比迭代更好(更快)的方法來寫入預定義的一維 numpy 數組? 我可以一次寫 >1 個元素嗎? 那會更快嗎?

我嘗試填充 arrays 然后使用np.concatenate()但速度明顯較慢。

我希望我可以做類似e[0][1:1+len(times)] = times的事情,但這不是我需要的維度中的索引。

這是一些示例代碼,要注意的關鍵是我的列比數據多,我正在創建一個列存儲,所以我需要記錄空值......

import numpy as np

# quote has arrived with 2 levels
time = 1509980228568000
times = [1509980228528000, 1509980228528000]
prices = [1.80699, 1.80698]
sizes = [100000.0, 250000.0]

# assume this is my 'schema'
number_of_levels = 4
dtypes = [('time', 'uint64'),
          ('bid_time0', 'uint64'), ('bid_time1', 'uint64'), ('bid_time2', 'uint64'), ('bid_time3', 'uint64'),
          ('bid_px0', 'float64'), ('bid_px1', 'float64'), ('bid_px2', 'float64'), ('bid_px3', 'float64'),
          ('bid_size0', 'float64'), ('bid_size1', 'float64'), ('bid_size2', 'float64'), ('bid_size3', 'float64')]
# create empty shell array
e = np.zeros(1, dtype=dtypes)

# add time
e[0][0] = time

# insert bid times
offset = 1
for i in range(min(number_of_levels, len(times))):
    e[0][offset+i] = times[i]

# insert bid prices
offset += number_of_levels
for i in range(min(number_of_levels, len(prices))):
    e[0][offset+i] = prices[i]

# insert bid sizes
offset += number_of_levels
for i in range(min(number_of_levels, len(sizes))):
    e[0][offset+i] = sizes[i]

或者-如果我正在做的事情有更好的方法,我會全神貫注:)

注意:這是一個稍微點頭的例子, number_of_levels在實踐中更大(但仍然只有~20),

# Create your row
row = [time] + times[:min(number_of_levels, len(times))] + \
    [0] * (number_of_levels - min(number_of_levels, len(times))) + \
    prices[:min(number_of_levels, len(prices))] + \
    [0] * (number_of_levels - min(number_of_levels, len(prices))) + \
    sizes[:min(number_of_levels, len(sizes))] + \
    [0] * (number_of_levels - min(number_of_levels, len(sizes)))

# Create a numpy array
arr = np.array(tuple(row), dtype=dtypes)

# Create a new array with supposedly with new data
arr2 = np.array(tuple(row), dtype=dtypes)

# Stack them up
arr3 = np.vstack((arr, arr2))

所以你已經創建了一個包含 1 個元素和 13 個字段的數組

In [241]: e                                                                                          
Out[241]: 
array([(55309248, 0, 0, 0, 0, 0., 0., 0., 0., 0., 0., 0., 0.)],
      dtype=[('time', '<u8'), ('bid_time0', '<u8'), ('bid_time1', '<u8'), ('bid_time2', '<u8'), ('bid_time3', '<u8'), ('bid_px0', '<f8'), ('bid_px1', '<f8'), ('bid_px2', '<f8'), ('bid_px3', '<f8'), ('bid_size0', '<f8'), ('bid_size1', '<f8'), ('bid_size2', '<f8'), ('bid_size3', '<f8')])

您可以將元組分配給該數組的元素 - 只需匹配字段數:

In [246]: e[0]                                                                                       
Out[246]: (55309248, 0, 0, 0, 0, 0., 0., 0., 0., 0., 0., 0., 0.)
In [247]: e[0]=tuple(range(13))                                                                      
In [248]: e                                                                                          
Out[248]: 
array([(0, 1, 2, 3, 4, 5., 6., 7., 8., 9., 10., 11., 12.)],
      dtype=[('time', '<u8'), ('bid_time0', '<u8'), ('bid_time1', '<u8'), ('bid_time2', '<u8'), ('bid_time3', '<u8'), ('bid_px0', '<f8'), ('bid_px1', '<f8'), ('bid_px2', '<f8'), ('bid_px3', '<f8'), ('bid_size0', '<f8'), ('bid_size1', '<f8'), ('bid_size2', '<f8'), ('bid_size3', '<f8')])

我不會嘗試從變量中計算出范圍和映射的組合。 那是你的任務。

結構化數組的數據可以是元組列表的形式。 但通常記錄比字段多得多,因此按字段為所有記錄分配值相對有效。

定義多維字段可能更容易:

In [249]: dt = [('time', 'uint64'), 
     ...:    ('bid_time', 'uint64', (4,)), ('bid_px', 'float64', (4,)), ('bid_size', 'float64', (4,))] 
                                                                                      
In [250]: dt                                                                                         
Out[250]: 
[('time', 'uint64'),
 ('bid_time', 'uint64', (4,)),
 ('bid_px', 'float64', (4,)),
 ('bid_size', 'float64', (4,))]
In [251]: e = np.zeros(3, dt)                                                                        
In [252]: e                                                                                          
Out[252]: 
array([(0, [0, 0, 0, 0], [0., 0., 0., 0.], [0., 0., 0., 0.]),
       (0, [0, 0, 0, 0], [0., 0., 0., 0.], [0., 0., 0., 0.]),
       (0, [0, 0, 0, 0], [0., 0., 0., 0.], [0., 0., 0., 0.])],
      dtype=[('time', '<u8'), ('bid_time', '<u8', (4,)), ('bid_px', '<f8', (4,)), ('bid_size', '<f8', (4,))])
In [253]: e['time']=[1,2,3]                                                                          
In [254]: e['bid_size']                                                                              
Out[254]: 
array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])

然后你可以一次分配多個值

e['bid_time'] = ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM