【问题标题】:Using a.append to create a numpy array of a desired shape使用 a.append 创建所需形状的 numpy 数组
【发布时间】:2018-01-14 07:16:30
【问题描述】:

我正在尝试使用以下代码将目录中 31 个文件中的 append 数据放入 numpy 数组中。

directory = r"C:\Users\matth\Downloads\AMSRE"
for root, dirs, filenames in os.walk(directory):
    for f in filenames:
        if f.startswith("AMSR_E_L3_DailyLand_V06_201001"):
            log = open(os.path.join(root, f), 'r')
            file_name = (("C:\\Users\\matth\\Downloads\\AMSRE\\") + f)
            hdf = SD(file_name, SDC.READ)
            g = gdal.Open(('HDF4_EOS:EOS_GRID:') + file_name + (':Ascending_Land_Grid:A_Soil_Moisture'))
            sm = g.ReadAsArray()
            lons = np.fromstring ( urllib2.urlopen("ftp://sidads.colorado.edu/pub/tools/easegrid/lowres_latlon/MLLONLSB").read(), \
dtype=np.int32 )/100000.
            lats = np.fromstring ( urllib2.urlopen("ftp://sidads.colorado.edu/pub/tools/easegrid/lowres_latlon/MLLATLSB").read(), \
dtype=np.int32 )/100000.
            lons = lons.reshape(sm.shape)
            lats = lats.reshape(sm.shape)
            smm = np.ma.array ( sm, mask=np.logical_or ( sm==-9999, sm==9999))
            soil_moisture = []
            soil_moisture.append(smm)
            soil_moisture2006 = np.asarray(soil_moisture)
        output = np.vstack(soil_moisture2006)

所有文件都以AMSR_E_L3_DailyLand_V06_201001开头,这就是我有这行的原因

if f.startswith("AMSR_E_L3_DailyLand_V06_201001"): 

一个文件的形状为(586, 1383)。我想要一个形状为(31, 586, 1383)numpy 数组,因为目录中有31 个文件。但是,当我在代码中创建的output 数组的shape print 时,它的形状是(586, 1383),我不知道为什么。有谁知道我如何使用append 创建一个形状为(31, 586, 1383) 的numpy 数组?提前致谢。

【问题讨论】:

  • 初始化soil_moisture外循环。并在循环后将其转换为数组。你不应该需要vstack。您是否练习过使用小型交互式案例进行此操作?从小处着手。

标签: python arrays numpy append


【解决方案1】:

np.vstack 确实将 numpy 数组的数组(或元组)堆叠到数组的行中,但您似乎只给了它一个数组。

我建议在循环遍历数据之前初始化 output 空数组(或其他一些虚假值)。然后我建议用以下内容替换最后一行,保持缩进与之前的内容不同

if output:
    output = np.vstack((output,soil_moisture2006))
else:
    output = soil_moisture2006

这将尝试将数据附加到output,除非它是第一组数据,在这种情况下,它会将output 初始化为该数据。这可确保output 与其余数据的形状相同,因此您可以在其上使用vstack。就像上面提到的评论一样,我真的不知道您是否需要使用vstack,但对我来说尝试使用您使用的方法回答您的问题似乎比完全重写它更容易。

我没有你的文件,所以显然我无法运行它来测试它,但它似乎可以解决你的问题。让我知道这是否有帮助。

【讨论】:

  • Oldtimers 不鼓励在循环中使用数组连接(或任何stack 变体)。列表追加效率更高。
猜你喜欢
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 2017-03-12
相关资源
最近更新 更多