创建一个空数组而不覆盖它

问题描述 投票:0回答:1

我想像添加 for 循环中的列表一样添加到数组中,但要做到这一点,我需要先创建一个空数组并添加到其中。我在这个网站上看到的每一个建议都使得旧数组被新数组覆盖,这看起来非常愚蠢。我正在提取的文件有 150 x 180,000 个数据点,因此列表不会削减它。如果创建一个列表如此简单,那么创建一个空数组是一项不可能完成的任务,这似乎很疯狂。

这是我现在的代码,但我想从等式中删除列表

from Bio import SeqIO
from Bio.SeqUtils import gc_fraction
import matplotlib.pyplot as plt
import gzip
import numpy as np
with gzip.open("data.fastq.gz",'rt') as input_file:
    sio = SeqIO.parse(input_file, "fastq")
    numdata = []
    for r in sio:
        numdata.append(r.letter_annotations['phred_quality'])
    npa = np.array(numdata)
    plt.boxplot(npa,showfliers = False)
    plt.title("Quality Score Boxplot")
    plt.xlabel("Number of Basepairs")
    plt.ylabel("Number of Reads")
    plt.show()
python arrays numpy bigdata numpy-ndarray
1个回答
0
投票

Numpy 数组是固定大小的,不允许像 python 列表那样动态调整大小。在对大型数据集执行数值运算时,这可以实现更好的性能和内存效率。 您可以将其视为用低级语言实现数组,其中您需要预定义数组。 对于您的情况,您可以执行以下操作之一:

  1. 选项-1:如果您提前知道元素数量(或上限),请预先定义一个具有常量值的 numpy 数组并就地填充。

  2. 选项2:如果您事先不知道元素数量(或上限),请使用最大大小的列表,然后附加到 numpy 数组,创建新副本并删除旧副本。 IMO Option-1 应该能够最适合您的用例,示例代码如下:

    将 numpy 导入为 np 随机导入 数字 = int(1e+6) 常量=0 arr = np.full(NUM, fill_value=CONST) sio = [12]*4 + [43]*4 随机洗牌(sio) 对于范围内的 i(len(sio)): arr[i] = sio[i] arr = arr[:i+1]

© www.soinside.com 2019 - 2024. All rights reserved.