【问题标题】:How to stack arrays of different shapes? Make a 3d-array from multiple 2d-arrays of different lengths如何堆叠不同形状的数组?从多个不同长度的 2d 数组中创建一个 3d 数组
【发布时间】:2020-04-25 11:20:39
【问题描述】:

一些背景

用于从多个文件中读取数据并将其堆叠以形成模仿 numpy 堆叠的二维数组列表的代码:

import glob
import pandas as pd
import numpy as np

def read_file(files):
    data = []
    for i in range( len(files) ):
                try:   
                    ehists.append( pd.read_csv(files[i], delimiter = "\t", compression='gzip', header=None).to_numpy() )
                except pd.errors.EmptyDataError:
                    pass
    return data


foldername = "datafolder"

### reading files with names file1, file2.......
files = glob.glob("./"+foldername+"/file*")

3dData = read_file(files)


主查询

为简单起见,假设每个文件有 3 列,但长度(行数)不同。第 1 列代表时间,第 2 列和第 3 列是当时的一些数据点。所以,一个典型的文件看起来有点像:

10    0.34    1.37
15    0.39    1.42
20    0.45    1.47
25    0.57    1.53
30    0.68    1.62
35    0.82    1.89
40    0.92    1.97

为了绘制所有文件在不同时间的第 2 列值的分布直方图,我使用以下代码解析数组列表:

import matplotlib.pyplot as plt

t_end = 1000
t = np.arange(0, t_end, 1)

y = []

for time in t:
    y_t = []
    for i in range( len(3dData) ):           ## iterating over files(2d-arrays)
        for j in range( np.shape(3dData[i])[0] ):  ## iterating over rows in the 2d-array
            if 3dData[i][j,0] == time:
                y_t.append( 3dData[i][j,1] )
    y.append( y_t )

## Hist of values at t=10
t0 = 10
plt.hist(y[t0])
plt.show()

我想要达到的目标是为我工作。但是,由于列表中有大约 100000 个二维数组,因此上面的代码需要很长时间才能运行。我觉得对象类型的不一致导致在解析数据时处理速度较慢。 (我的想法是否正确,并且)有没有办法堆叠不同形状的二维数组而不必填充二维数组数据?

P.S.:如果需要,我可以提供更多信息,我非常乐意收到有关如何使此代码更高效的建议/建议。

感谢您的时间和精力!

【问题讨论】:

  • 请阅读How to Ask 以及如何提供minimal reproducible example。如果它能够解决特定的代码问题并且不那么笼统,您的问题需要更加集中和最好
  • @Tomerikoo 感谢您的意见,我编辑了问题以包含更多详细信息。

标签: python arrays list


【解决方案1】:

可能有更好的方法来做到这一点。 numpy 对于操作数组可能会更高效。

但这是使用zip_longest() 标准化列表长度的一种方法。这将导致整个数据集的迭代,因为列表项是通过两个级别的 zip 迭代器拉出的。

>>> from itertools import zip_longest
>>>
>>> rows = [[random.randint(100, 999) 
...          for _ in range(random.randint(5, 10))] 
...         for _ in range(10)]
...
>>> for row in rows:
...     print(row)
...     
[826, 735, 223, 394, 885, 122, 259, 899, 788, 121]
[984, 405, 185, 984, 727, 901, 704, 526, 936]
[617, 814, 801, 382, 138, 245, 225]
[314, 478, 103, 509, 559, 687, 124, 869, 596]
[982, 741, 714, 489, 613, 392, 940, 577, 155]
[752, 262, 365, 213, 451, 925, 610]
[555, 288, 277, 975, 573]
[507, 753, 537, 721, 629]
[235, 971, 970, 721, 571]
[367, 627, 335, 955, 410, 393, 387, 935, 793]
>>> 
>>> padded_rows = [list(row) for row in zip(*zip_longest(*rows, fillvalue='#'))]
>>> for row in padded_rows:
...     print(row)
...     
[826, 735, 223, 394, 885, 122, 259, 899, 788, 121]
[984, 405, 185, 984, 727, 901, 704, 526, 936, '#']
[617, 814, 801, 382, 138, 245, 225, '#', '#', '#']
[314, 478, 103, 509, 559, 687, 124, 869, 596, '#']
[982, 741, 714, 489, 613, 392, 940, 577, 155, '#']
[752, 262, 365, 213, 451, 925, 610, '#', '#', '#']
[555, 288, 277, 975, 573, '#', '#', '#', '#', '#']
[507, 753, 537, 721, 629, '#', '#', '#', '#', '#']
[235, 971, 970, 721, 571, '#', '#', '#', '#', '#']
[367, 627, 335, 955, 410, 393, 387, 935, 793, '#']
>>> 

不知道篡改数据是什么意思。这种方法只是将数据的引用从一个列表复制到另一个列表 - 因此它不会对数据本身执行任何操作。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多