Python - 将numpy数组转换为JSON

3

我有一个名为myarray的Python numpy数组,它看起来像这样。

Original Answer翻译成"最初的回答"

[[148 362]
 [153 403]
 [163 443]
 [172 483]
 [186 521]
 [210 553]
 [239 581]
 [273 604]
 [314 611]
 [353 602]]

我可以帮你翻译。需要创建的是这样的JSON格式...,即"最初的回答"。
myjson = [
    {'section': '3',
     'x': '163',
     'y': '362',
    },
    {'section': '7',
     'x': '239',
     'y': '581',
    },
    {'section': '10',
     'x': '353',
     'y': '602',
    },
]

这表示原始的numpy数组中的第3710行。有没有类似实现的示例?

最初的回答:


谁选择要序列化的数组? - undefined
请问你能告诉我吗?这会影响你得到的答案。过滤应该在什么时候进行?在序列化之前还是期间?我不确定。或者这只是一个例子,你希望以这种方式获取所有行的索引吗? - undefined
4个回答

3
补充一下Andrii的回答,我认为你也可以像这样解包数组,使代码更加简洁:
[{'section': i+1, 'x': x, 'y': y} for i, [x, y] in enumerate(myarray) if i in [2, 6, 9]]

谢谢您注意到了,我漏掉了那部分。 - undefined
当我尝试对其进行序列化时,出现了一个错误消息 - TypeError: Object of type 'int64' is not JSON serializable - 我猜测这是因为它是NumPy值而不是Python整数。 - undefined
@fightstarr20,你是对的。我相信使用pd.DataFrame的解决方案更好,但如果你想让它工作,你需要用int(x)int(y)来包装xy - undefined

2
如果您的输入数组是arr,我相信您想要这样的东西:最初的回答
[{'section': i+1, 'x': x[0], 'y': x[1]} for i, x in enumerate(arr) if i in [2, 6, 9]]

[2, 6, 9]是你的[3, 7, 10]位置,从0开始计数。


润色后的翻译:[2, 6, 9]是你需要的[3, 7, 10]位置,但是这些位置是从0开始计数的。

2

pandas 提供了一个方便的解决方案:

最初的回答
import pandas as pd
import numpy as np

df=pd.DataFrame(myarray, columns=["x", "y"])
df["Section"]=df.index

df.to_json(orient="records")

最初的回答
这将产生以下结果:
 '[{"x":148,"y":362,"Section":0},{"x":153,"y":403,"Section":1},
{"x":163,"y":443,"Section":2},{"x":172,"y":483,"Section":3},
{"x":186,"y":521,"Section":4},{"x":210,"y":553,"Section":5},
{"x":239,"y":581,"Section":6},{"x":273,"y":604,"Section":7},
{"x":314,"y":611,"Section":8},{"x":353,"y":602,"Section":9}]'

这个解决方案有点不同,但你可以很容易地在纯Python中找到方法将其转换为你的结构。翻译结果:

解决方案略有不同,但你可以轻松地在纯Python中找到方法将其转换为你的结构。


0

我需要一个类似的东西,但适用于更一般的情况。 这将递归地替换Python dictlistset或它们的任意组合中的任何numpy ndarray,可以直接替换或返回一个numpy化的副本。

from copy import deepcopy
import numpy as np

def unnumpyify(something, inplace=False):
    if inplace:
        new_something = something
    else:
        new_something = deepcopy(something)
    if type(new_something) == np.ndarray:
        new_something = new_something.tolist()
    if type(new_something) == dict:
        for k in new_something:
            if type(new_something[k]) == np.ndarray:
                new_something[k] = new_something[k].tolist()
            if type(new_something[k]) == dict:
                new_something[k] = unnumpyify(new_something[k])
            elif type(new_something[k]) == list:
                new_something[k] = unnumpyify(new_something[k])
    elif type(new_something) == list:
        for i,k in enumerate(new_something):
            if type(k) == np.ndarray:
                new_something[i] = k.tolist()
            if type(k) == dict:
                new_something[i] = unnumpyify(k)
            elif type(k) == list:
                new_something[i] = unnumpyify(k)
    elif type(new_something) == set:
        for k in new_something:
            if type(k) == np.ndarray:
                new_something.remove(k)
                new_k = k.tolist()
                new_something.add(new_k)
            if type(k) == dict:
                new_something.remove(k)
                new_k = unnumpyify(k)
                new_something.add(new_k)
            elif type(k) == list:
                new_something.remove(k)
                new_k = unnumpyify(k)
                new_something.add(new_k)
    return new_something

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接