python - NumPy 数组可以有值的元组吗?

标签 python arrays numpy tuples

背景

我正在导入一个 JSON 文件,其架构如下:

{
    "000001": {
        "USA": {
            "requests": 1234,
            "RTT": 40
        },
        "Japan": {
            "requests": 10,
            "RTT": 200
        }
    },
    "000002": {
        "USA": {
            "requests": 4321,
            "RTT": 50
        },
        "Japan": {
            "requests": 10,
            "RTT": 150
        }
    }
}

导入后,我希望对此数据执行两件事:

  1. 执行大量分析和数学计算,NumPy 非常擅长
  2. 将数据转储到数据库

将其转储到数据库后,我期望有如下所示的架构:

+--------+---------+----------+-------+
|  time* | country*| requests |  RTT  |
+--------+---------+----------+-------+
| 000001 | USA     |   1234   | 40ms  |
| 000001 | Japan   |    10    | 200ms |
| 000002 | USA     |   4321   | 50ms  |
| 000002 | Japan   |    20    | 150ms |
|  ...   |   ...   |    ...   |  ...  |

问题

当前要导入数据,我正在执行以下操作:

>>>import numpy as np
>>>import flatdict as fd
>>>np.array(fd.FlatDict(json_string))
array([[000001, u'USA', u'requests', 1234],
       [000001, u'USA', u'RTT', 40],
       [000001, u'Japan', u'requests', 10],
       ...,
       [000002, u'USA', u'RTT', 50],
       [000002, u'Japan', u'requests', 20],
       [000002, u'Japan', u'RTT', 150]],
      dtype='<U31')

这里的问题是,这会为每个值而不是每个键创建一个唯一的行。如果有必要,我愿意编写自己的函数来替换 flatdict,但问题是:NumPy 可以有元组/数组/对象作为值吗?理想情况下,我想要如下输出:

>>>np.array(data)
array([[000001, u'USA', (1234, 40)],
       [000001, u'Japan', (10, 200)],
       [000002, u'USA', (4321, 50)],
       [000002, u'Japan', (20, 150)]],
      dtype='...')

但是我愿意接受:

>>>np.array(data)
array([[000001, u'USA', 1234, 40],
       [000001, u'Japan', 10, 200],
       [000002, u'USA', 4321, 50],
       [000002, u'Japan', 20, 150]],
      dtype='...')

可接受的替代解决方案

对于第一步(执行所有分析),我可以使用我现在拥有的 NumPy 数组。像 array[:,"USA","re​​quests"] 这样的东西会返回美国所有时间的请求数量。

在第二步中,我需要将其转换为不同的格式。如果有办法的话:

array([[000001, u'USA', u'requests', 1234],
       [000001, u'USA', u'RTT', 40],
       [000001, u'Japan', u'requests', 10],
       ...,
       [000002, u'USA', u'RTT', 50],
       [000002, u'Japan', u'requests', 20],
       [000002, u'Japan', u'RTT', 150]],
      dtype='<U31')

并将其输入表单:

[[000001, u'USA', 1234, 40],
 [000001, u'Japan', 10, 200],
 [000002, u'USA', 4321, 50],
 [000002, u'Japan', 20, 150]]

为了将其转储到数据库中,也可以

最佳答案

您在扁平化字典时遇到问题;对 flatdict 了解不多,但如果你有一个三层字典,你可以使用列表理解来扁平化它:

[[k, kk, d[k][kk].get('requests'), d[k][kk].get('RTT')] for k in d for kk in d[k]]

#[['000002', 'USA', 4321, 50],
# ['000002', 'Japan', 10, 150],
# ['000001', 'USA', 1234, 40],
# ['000001', 'Japan', 10, 200]]
<小时/>

对于非同质数据,如果您需要在内存中进行分析,pandas通常比numpy更容易使用,您可以将其转换为这样的数据框:

lst = [[k, kk, d[k][kk].get('requests'), d[k][kk].get('RTT')] for k in d for kk in d[k]]

import pandas as pd
pd.DataFrame(lst, columns=['time', 'country', 'requests', 'RTT'])

enter image description here

关于python - NumPy 数组可以有值的元组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45944827/

相关文章:

arrays - 如何通过 INT id 从 PostgreSQL 函数返回值数组

python - NumPy 数据类型比较

python - 在张量中分配行会抛出 "None values not supported"

python - 为什么map_async()不需要pool.close()和pool.join()?

python - 在虚拟环境中使用 Apt-Get Python 包

python - 如何在 Pandas 中将两列合并在一起

php - 如何清理 PHP 换行符

php - 第 15 行的 fatal error : Allowed memory size of 67108864 bytes exhausted (tried to allocate 35 bytes) in/home/content/08/10674308/html/Arraytest. php

python - 拟合线性回归模型的数值误差

python - numpy:压缩 block 矩阵