【问题标题】:Creating multiple arrays within a for loop (Python)在 for 循环中创建多个数组(Python)
【发布时间】:2015-10-23 10:51:01
【问题描述】:

我目前遇到了 Numpy 数组的问题。如果这个问题已经在别处问过,我很抱歉,但我觉得我到处都看过。

我最初的问题是我试图创建一个数组并用多组不同大小的站数据填充它。由于我无法用大小不同的数据集填充同一个数组,因此我决定需要通过在我用来遍历每个站数据集的 for 循环内定义数组来为每个站数据集创建一个新数组。这样做的问题是,在循环时,每个数据集都会覆盖之前的数据集,只返回 for 循环的最终实例。

然后,我尝试使用 + 和连接操作为每个数组连接一个新标题,但在定义数组时发现这是非法的。这是程序的实例,其中每个数据数组都覆盖前一个数据数组。请注意,并非所有代码都包含在内,这是定义的一部分。

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 还是很陌生(对在这里发帖也是新手),任何想法都将不胜感激。

【问题讨论】:

  • 感谢您的想法,但问题不在于填充数组,而在于在迭代 for 循环后保留每个数组(而不是覆盖它)。跨度>

标签: python arrays for-loop numpy


【解决方案1】:

您每次都将 2D 数组设置为零inside您的 k-loop。一旦在嵌套循环之外,将其设置为零(或空,如果所有元素都被填充,就像你的情况一样),你应该没问题:

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

【讨论】:

  • 这实际上是我最初所做的,但问题是大小的 len(temp) 条目随每个站 id 而变化。这就是为什么我不能在循环之外定义一个数组 - 每个站数据集都有不同数量的条目。
  • @ginger 如果由于不知道最终的 2D 大小而无法在循环外定义数组,那么首先就不能使用 numpy 数组:它们必须有一个分配时预定义的大小。但是,您的代码甚至没有显示 temp 的大小可变,这让我很困惑。
【解决方案2】:

您会得到一个大部分为 0 的 metar_dat 数组,因为它是您在最后一次 k 迭代中创建的数组。它是len(stat_id) long(在第一维中),但您只插入了最后一个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

如果len(temp) 因每个id 而不同,则您无法制作具有形状(len(stat_id), len(temp), 7) 的有意义的 3d 数组 - 除非您将每个数组填充到相同的最大长度。当考虑数组时,事物是矩形,而不是参差不齐的列表。

Python 字典是通过某种唯一 ID 收集信息的更好方法。

对象数组可让您概括数值数组的概念,但与列表或字典相比,它们并没有提供太多额外的功能。例如,您不能跨“id”维度添加值。

您需要描述收集这些数据后希望如何处理这些数据。这将有助于指导我们关于数据表示的建议。

还有其他方法可以为每个id 定义数据结构。看起来yrtimetemp 是等长数组。如果它们都是数字,则可以将它们收集到一个 6 列的数组中。如果保留一些整数很重要,而另一些是浮点数(甚至是字符串),则可以使用结构化数组。

结构化数组通常是通过从 csv 文件中读取列数据来生成的。一些列将有字符串数据(id),其他的整数甚至日期,其他的浮点数据。 np.genfromtxt 是加载此类文件的好工具。

【讨论】:

    【解决方案3】:

    你也可以看看这篇文章,

    How can I make multiple empty arrays in python?

    查找list comprehensions

    listOfLists = [[] for i in range(N)] 现在,listOfLists 中有 N 个空列表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      相关资源
      最近更新 更多