numpy 在for循环中创建多个数组(Python)

kb5ga3dv  于 2022-11-29  发布在  Python
关注(0)|答案(3)|浏览(204)

我目前遇到了一个关于Numpy数组的问题。如果这个问题已经在其他地方被问到了,我很抱歉,但是我觉得我已经到处找过了。
我最初遇到的问题是,我试图创建一个数组,并用不同大小的多组站点数据填充它。由于我无法用不同大小的数据集填充同一个数组,我决定需要通过在for循环中定义数组来为每个站点数据集创建一个新数组,我正在使用for循环来迭代每个站点数据集。这样做的问题是,在循环时,每个数据集将覆盖前一个数据集,只返回for循环的最后一个示例。
然后,我尝试使用+和join操作为每个数组连接一个新的标题,但结果发现在定义数组时这是非法的。这是程序的一个示例,其中每个数据数组覆盖前一个数组。注意,并不是所有的代码都包括在内,这是定义的一部分。

for k in range(len(stat_id)):

    ## NOTE - more code precedes this final portion of the for loop, but was
    ## not included as it is unrelated to the issue at hand.

    # Bring all the data into one big array.
    metar_dat = np.zeros((len(stat_id),len(temp),7), dtype='object')
    for i in range(len(temp)):
        metar_dat[k,i] = np.dstack((stat_id[k], yr[i], month[i], day[i], time[i], temp[i], dwp[i]))
    #print np.shape(metar_dat[k])
    #print metar_dat[k]

#print np.shape(metar_dat) # Confirm success with shape read.
return metar_dat

在运行并打印此定义中的数组时,我得到了以下结果(两个空数组和一个最终填充的数组):

[[[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 ..., 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]]

[[\TZR 2015 7 ..., 2342 58 48]
[\TZR 2015 7 ..., 2300 59 47]
[\TZR 2015 7 ..., 2200 60 48]
..., 
[\TZR 2015 7 ..., 0042 56 56]
[\TZR 2015 7 ..., 0022 56 56]
[\TZR 2015 7 ..., 0000 56 56]]]

我的问题是:
如何为每组桩号数据创建一个数组,以便不覆盖以前的任何数据?
或者
如何创建包含不同行数的数据集的单个数组?
我还是Python的新手(也是在这里发帖的新手),任何想法都将非常感谢。

l0oc07j2

l0oc07j21#

每次在k-循环内将二维数组设置为零,在嵌套循环外将其设置为零(或者空,如果所有元素都被填充,就像你的例子一样),应该没问题:

metar_dat = np.empty((len(stat_id),len(temp),7), dtype='object')
for k in range(len(stat_id)):
    for i in range(len(temp)):
        metar_dat[k,i] = np.dstack((stat_id[k], yr[i], month[i], day[i], time[i], temp[i], dwp[i]))
return metar_dat
l7mqbcuq

l7mqbcuq2#

你得到一个metar_dat数组,大部分是0,因为它是你在最后一次k迭代中创建的。它的长度是len(stat_id)(在第一维中),但你只插入了最后一个k的数据。你丢弃了前面k的结果。
我建议在字典中收集数据,而不是对象数组。

metar_dat = dict()  # dictionary rather than object array
for id in stat_id:
    # Bring all the data into one big array.
    data = np.column_stack([yr, month, day, time,temp, dwp])
    # should produce as (len(temp),6) integer array
    # or float is one or mo    for k in range(len(stat_id)):
    metar_dat[id] = data

如果每个idlen(temp)都不相同,你就不能用(len(stat_id), len(temp), 7)的形状来构造一个有意义的三维数组--除非你把每个len(temp)填充到相同的最大长度。
Python字典是通过某种唯一id收集信息的更好方法。
对象数组可以让你概括数字数组的概念,但是与列表或字典相比,它们并没有提供太多的附加功能。例如,你不能在'id'维度上添加值。
你需要描述你收集这些数据后希望做什么,这将有助于指导我们关于数据表示的建议。
还有其他方法来定义每个id的数据结构。看起来yrtimetemp是等长数组。如果它们都是数字,可以将它们收集到一个6列数组中。如果需要保留一些整数,而其他是浮点数(甚至是字符串),则可以使用结构化数组。
结构化数组通常是通过从csv文件中读取列数据生成的。有些列包含字符串数据(id),有些包含整数甚至日期,还有一些包含浮点数据。np.genfromtxt是加载这类文件的好工具。

wydwbb8l

wydwbb8l3#

你也可以看看这篇文章,
How can I make multiple empty arrays in python?
查找列表解析
listOfLists = [[] for i in range(N)]现在,listOfLists中有N个空列表

相关问题