【问题标题】:dict of dict of list tensor/pandas-dataframe/numpy-array列表张量/pandas-dataframe/numpy-array的dict的dict
【发布时间】:2019-04-18 08:20:20
【问题描述】:

我是 pandas 和 numpy 的初学者

我正在使用this paper 中提到的数据集,

我有几张图片,每张图片都用一定的视觉描述符来描述,比如CM、CN、GLRLM(这些描述符的含义并不重要),这些视觉描述符基本上都是列表。

所以我的数据结构是:

idsDict = {
    12312: {
         "CM": [2, 3, 1, 5, 1],
         "CN" : [1, 4, 5, 1]
    },
    21367: {
         "GLRLM": [9, 4, 1, 4, 5, 12, 67, 12],
         "CM"   : [1, 6, 8, 1, 34]
    }
}

12312, 21367 是图片的id

我想将其转换为张量/numpy-array(3D)/pandas-dataframe(3D),以便我可以根据描述符找到图像之间的距离。

tensor/numpy-array(3D)/pandas-dataframe(3D) 的结构基本上是一个长方体,其中行作为图像 id,列作为描述符,z 轴将包含描述符的值

我读过,

Construct pandas DataFrame from items in nested dictionary

Pandas dataframe to dict of dict

【问题讨论】:

  • 你能发布预期的输出结构吗?
  • 我认为的问题是你的描述符的长度不同,不同的图像有不同的描述符。这种异质性使得使用 numpy 或 pandas 变得很棘手。
  • 我认为您需要修复数据结构的语法。最上面一行应该是idsDict = {,而且似乎有不必要的嵌套大括号级别。
  • @tel 修复了额外的 {
  • @VivekKalyanarangan 你想要图表吗?最后一段在解释结构上是否含糊不清?

标签: pandas numpy dataframe bigdata tensor


【解决方案1】:

就计算速度而言,最好使用 Numpy:

import numpy as np

idsDict = {
    12312: {
      "CM": [2, 3, 1, 5, 1],
      "CN" : [1, 4, 5, 1]
    },
    21367: {
      "GLRLM": [9, 4, 1, 4, 5, 12, 67, 12],
      "CM"   : [1, 6, 8, 1, 34]
    }
}

# loop through once to figure out size of final data structure
dscr = {}
maxlen = 0
for d in idsDict.values():
    for descName,desc in d.items():
        if descName not in dscr:
            dscr[descName] = np.obj2sctype(desc[0]) if len(desc) else np.int64
        if len(desc) > maxlen:
            maxlen = len(desc)

# allocate a masked structured array of the right shape and dtype
dtype = np.dtype(sorted(dscr.items()))
_data3d = np.empty((len(idsDict), maxlen), dtype=dtype)
data3d = np.ma.array(_data3d, mask=True)

# copy the data over the array
for d,drow in zip(idsDict.values(), data3d):
    for descName,desc in d.items():
        drow[descName][:len(desc)] = desc

print(data3d.dtype.names,'\n')
print(data3d.T)

哪些输出:

('CM', 'CN', 'GLRLM')

[[(2.0, 1.0, --) (1.0, --, 9.0)]
 [(3.0, 4.0, --) (6.0, --, 4.0)]
 [(1.0, 5.0, --) (8.0, --, 1.0)]
 [(5.0, 1.0, --) (1.0, --, 4.0)]
 [(1.0, --, --) (34.0, --, 5.0)]
 [(--, --, --) (--, --, 12.0)]
 [(--, --, --) (--, --, 67.0)]
 [(--, --, --) (--, --, 12.0)]]

不幸的是,没有很好的方法将图像 ID 保存在 Numpy 结构化数组中。如果你需要这些,你可以使用 Pandas 代替。以下是如何将所有数据压缩到单个 Pandas 3D 数据框中:

import pandas as pd

idsDict = {
    12312: {
      "CM": [2, 3, 1, 5, 1],
      "CN" : [1, 4, 5, 1]
    },
    21367: {
      "GLRLM": [9, 4, 1, 4, 5, 12, 67, 12],
      "CM"   : [1, 6, 8, 1, 34]
    }
}

# loop through once to figure out size of final data structure
descNames = set()
maxlen = 0
for d in idsDict.values():
    for descName,desc in d.items():
        descNames.add(descName)
        if len(desc) > maxlen:
            maxlen = len(desc)

# pad data
padDesc = maxlen*[np.nan]
for d in idsDict.values():
    for desc in d.values():
        dlen = len(desc)
        if dlen < maxlen:
            desc.extend((maxlen - dlen)*[np.nan])
    for descName in (n for n in descNames if n not in d):
        d[descName] = padDesc

data3d = pd.concat([pd.DataFrame(d) for id,d in idsDict.items()], keys=idsDict.keys())
print(data3d)

这个输出:

           CM   CN  GLRLM
12312 0   2.0  1.0    NaN
      1   3.0  4.0    NaN
      2   1.0  5.0    NaN
      3   5.0  1.0    NaN
      4   1.0  NaN    NaN
      5   NaN  NaN    NaN
      6   NaN  NaN    NaN
      7   NaN  NaN    NaN
21367 0   1.0  NaN    9.0
      1   6.0  NaN    4.0
      2   8.0  NaN    1.0
      3   1.0  NaN    4.0
      4  34.0  NaN    5.0
      5   NaN  NaN   12.0
      6   NaN  NaN   67.0
      7   NaN  NaN   12.0

【讨论】:

    猜你喜欢
    • 2021-10-06
    • 2018-06-09
    • 2019-08-25
    • 2018-08-11
    • 2018-10-14
    • 1970-01-01
    • 2018-06-20
    • 2018-12-11
    • 2021-11-26
    相关资源
    最近更新 更多