列表张量/熊猫数据框/ numpy数组的字典

时间:2018-11-15 09:13:00

标签: pandas numpy dataframe bigdata tensor

我是熊猫和numpy的初学者

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

我有几幅图像,每个图像由某些视觉描述符(例如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),以便我可以基于描述符找到图像之间的距离。

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

我读过

this paper

Construct pandas DataFrame from items in nested dictionary

1 个答案:

答案 0 :(得分:0)

就计算速度而言,使用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