簡體   English   中英

如何將字典中的二維 arrays 轉換為一個數組?

[英]How to convert 2D arrays in dictionary into one single array?

我有以下代碼:

import random
import numpy as np
import pandas as pd

num_seq = 100
len_seq = 20
nts = 4
sequences = np.random.choice(nts, size = (num_seq, len_seq), replace=True)
sequences = np.unique(sequences, axis=0) #sorts the sequences

d = {}
pr = 5

for i in range(num_seq):
    globals()['seq_' + str(i)] = np.tile(sequences[i,:],(pr,1))
    d['seq_' + str(i)] = np.tile(sequences[i,:],(pr,1))

pool = np.empty((0,len_seq),dtype=int)
for i in range(num_seq):
    pool = np.concatenate((pool,eval('seq_' +str(i))))

我想將字典d轉換為 Numpy 數組(或只有一個條目的字典)。 我的代碼有效,產生pool 但是,在num_seqlen_seqpr的值較大時,需要很長時間。

執行時間很關鍵,因此我的問題是:有沒有更有效的方法來做到這一點?

以下是要點列表:

  • np.concatenateO(n)中運行,因此您的第二個循環在O(n^2)時間內運行。 您可以將 append 的值放到一個列表中,然后np.vstack將所有值放在最后(在O(n)時間內)。
  • 訪問globals()很慢並且被認為是一種不好的做法(因為它很容易以令人討厭的方式破壞您的代碼);
  • 調用eval(...)也很慢而且也不安全,所以避免它;
  • 默認的 CPython 解釋器不會優化重復的表達式(它會重新計算它們)。
  • 您可以使用 Cython 或 Numba 稍微加快代碼速度(請注意,字典的支持在 Numba 中是實驗性的)。

這是一個更快的代碼示例(代替第二個循環):

pool = np.vstack([d[f'seq_{i}'] for i in range(num_seq)])

暫無
暫無

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

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