我目前遇到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的新手(也是我在这里发布的新手),我们非常感谢任何想法。
答案 0 :(得分:0)
每次将你的二维数组设置为里面你的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
答案 1 :(得分: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)
的有意义的3d数组 - 除非您将每个数组填充到相同的最大长度。在考虑数组,事物矩形,而不是粗糙的列表时。
Python字典是通过某种唯一ID收集信息的更好方法。
对象数组允许您概括数值数组的概念,但与列表或词典相比,它们不会提供更多的附加功能。例如,您可以在&id; id'中添加值。尺寸。
收集后,您需要描述您希望对此数据执行的操作。这将有助于指导我们关于数据表示的建议。
还有其他方法可以为每个id
定义数据结构。它看起来像yr
,time
,temp
是等长数组。如果它们都是数字,则可以将它们收集到具有6列的数组中。如果保持一些整数是重要的,而其他的是浮点数(甚至字符串),你可以使用结构化数组。
通常通过从csv文件中读取列数据来生成结构化数组。某些列将包含其他整数甚至日期的字符串数据(ids),其他列将浮动数据。 np.genfromtxt
是加载那种文件的好工具。
答案 2 :(得分:0)
你也可以看一下这篇文章,
How can I make multiple empty arrays in python?
listOfLists = [[] for i in range(N)] 现在,listOfLists中有N个空列表