首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NumPy数组可以为值设置元组吗?

NumPy数组可以为值设置元组吗?
EN

Stack Overflow用户
提问于 2017-08-29 17:17:01
回答 1查看 63关注 0票数 1

背景

我正在使用模式导入一个JSON文件,如下所示:

代码语言:javascript
复制
{
    "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. 将数据转储到数据库

在将其转储到数据库时,我希望得到一个模式,如下所示:

代码语言:javascript
复制
+--------+---------+----------+-------+
|  time* | country*| requests |  RTT  |
+--------+---------+----------+-------+
| 000001 | USA     |   1234   | 40ms  |
| 000001 | Japan   |    10    | 200ms |
| 000002 | USA     |   4321   | 50ms  |
| 000002 | Japan   |    20    | 150ms |
|  ...   |   ...   |    ...   |  ...  |

问题

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

代码语言:javascript
复制
>>>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可以为值提供元组/ ararys /对象吗?理想情况下,我希望输出如下所示:

代码语言:javascript
复制
>>>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='...')

不过,我愿意接受:

代码语言:javascript
复制
>>>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","requests"],它将始终返回在美国的请求数量。

这是第二步,我需要把它变成一种不同的格式。如果有办法的话

代码语言:javascript
复制
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')

把它写进表格:

代码语言:javascript
复制
[[000001, u'USA', 1234, 40],
 [000001, u'Japan', 10, 200],
 [000002, u'USA', 4321, 50],
 [000002, u'Japan', 20, 150]]

为了将其转储到数据库中,这也是可以的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-29 17:29:07

整理字典有问题;对flatdict不太了解,但如果您有一个三级字典,您只需使用列表理解来将其压平:

代码语言:javascript
复制
[[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,则可以将其转换为如下所示的数据框架:

代码语言:javascript
复制
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'])

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45944827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档