相关文章推荐
有情有义的大白菜  ·  python ...·  1 月前    · 
完美的馒头  ·  python QTreeWidget ...·  4 周前    · 
失眠的烤红薯  ·  python qt textBrowser ...·  3 周前    · 
帅气的领带  ·  【Pyspark ...·  1 周前    · 
近视的橙子  ·  python ...·  1 周前    · 
俊秀的跑步机  ·  蓝牙mac地址-掘金·  1 年前    · 
乖乖的树叶  ·  使用Spring Data ...·  1 年前    · 

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

3 人关注

我目前在Numpy数组方面遇到一个问题。如果这个问题在其他地方已经被问过了,我很抱歉,但我觉得我已经找遍了所有的地方。

我最初的问题是,我试图创建一个数组,并将不同大小的多个站点数据集填入其中。由于我不能用不同大小的数据集填充同一个数组,我决定我需要为每个站点的数据集创建一个新的数组,在我用来迭代每个站点数据集的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]]]

My question is this:

我怎样才能为每一组台站数据创建一个数组,使其不覆盖任何以前的数据?

如何创建一个包含不同行数的数据集的单一数组?

我仍然是Python的新手(也是在这里发帖的新手),如果有任何想法,我将非常感激。

1 个评论
谢谢你的想法,但问题不在于填充数组,而是在for循环迭代后保留每个数组(而不是覆盖它)。
python
arrays
for-loop
numpy
ginger
ginger
发布于 2015-08-01
3 个回答
user707650
发布于 2015-08-01
0 人赞同

你正在将你的二维数组设置为零 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 是可变大小的,这让我感到困惑。
hpaulj
hpaulj
发布于 2015-08-01
0 人赞同

你得到一个 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

如果len(temp)对每个id来说都是不同的,那么你就不能用形状(len(stat_id), len(temp), 7)做出一个有意义的三维数组。- 除非你把每一个都垫到相同的最大长度。 当考虑到数组时,要考虑矩形,而不是锯齿状的列表。

Python字典是一种更好的方式,通过某种独特的id来收集信息。

对象数组让你概括了数字数组的概念,但与列表或字典相比,它们并没有提供太多的附加能力。 例如,你不能在 "id "维度上添加数值。

你需要描述一旦收集到这些数据,你希望用它做什么。 这将有助于指导我们关于数据表述的建议。

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

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

Anoop Toffy
Anoop Toffy
发布于 2015-08-01
0 人赞同

你也可以看看这个帖子。

如何在python中制作多个空数组?