如何将字典中的二维数组转换为单个数组?

2024-09-26 18:15:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

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的值较大时,需要很长时间

执行时间非常关键,因此我的问题是:有没有更有效的方法


Tags: 代码inimportforlenasnprandom
1条回答
网友
1楼 · 发布于 2024-09-26 18:15:54

以下是要点列表:

  • np.concatenateO(n)中运行,因此第二个循环在O(n^2)时间内运行。您可以将该值附加到列表中,并np.vstack最后添加所有值(在O(n)时间内)
  • 访问globals()速度很慢,而且众所周知这是一种糟糕的做法(因为它很容易以令人讨厌的方式破坏代码)
  • 调用eval(...)也很慢而且不安全,所以要避免它
  • 默认的CPython解释器不会优化重复的表达式(它会重新计算它们)
  • 您可以使用Cython稍微加快代码或Numba的速度(注意,字典的支持在Numba中是实验性的)

下面是一个更快的代码示例(替换第二个循环):

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

相关问题 更多 >

    热门问题