【问题标题】:Concatenate dicts of numpy arrays retaining numpy dtype连接保留 numpy dtype 的 numpy 数组的字典
【发布时间】:2017-10-23 14:13:11
【问题描述】:

我在一个循环中连接 python dicts(未显示)。我在循环的第一个实例上声明了一个新的空字典(dsst_mean_all):

if station_index == 0:
    dsst_mean_all = {}
    for key in dsst_mean:                        
        dsst_mean_all[key] = []               

source = [dsst_mean_all, dsst_mean]                
    for key in source[0]:
        dsst_mean_all[key] = np.concatenate([d[key] for d in source])

然后,正如您在上面代码的第二部分中看到的那样,我将在循环中获得的字典 (dsst_mean) 与将保存所有数据的大字典 (dsst_mean_all) 连接起来。

现在 dsst_mean 是一个字典,其元素是不同类型的 numpy 数组。大多数是float32。我的问题是,如何在连接期间保留数据类型?我的 dsst_mean_all 字典最终成为所有元素的 float64 numpy 数组。我需要这些来匹配 dsst_mean 以节省内存并减小文件大小。请注意,循环所有迭代的 dsst_mean 具有相同的结构和相同 dtype 的元素。

谢谢。

【问题讨论】:

  • 您的描述混淆了字典、列表和数组。 source 中的值是数组还是列表?
  • source 只是两个字典的列表:dsst_mean_all 和 dsst_mean
  • 通常我们建议将所有组件数组收集在一个列表中,并在最后进行一次连接。这通常比重复连接更快,并且更容易初始化。

标签: python numpy dictionary concatenation


【解决方案1】:

您可以在列表推导中定义数组的dtype

硬编码:

dsst_mean_all[key] = np.concatenate([d[key].astype('float32') for d in source])

或动态:

dsst_mean_all[key] = np.concatenate([d[key].astype(d[key].dtype) for d in source])

文档:https://docs.scipy.org/doc/numpy-1.13.0/user/basics.types.html

【讨论】:

    【解决方案2】:

    解决这个问题的一种方法是避免将 dsst_mean_all 声明为新的空字典。这 - 我认为 - 这就是为什么默认情况下所有内容都被强制转换为 float64 的原因。使用 if/else 语句,在第一次迭代时只需将 dsst_mean_all 设置为 dsst_mean,而对于所有后续迭代,按照我的原始问题所示进行连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 2019-09-29
      • 2016-01-08
      • 2017-01-16
      • 2018-11-03
      • 1970-01-01
      • 2022-01-22
      相关资源
      最近更新 更多