当前位置: 首页 > 面试题库 >

将numpy类型转换为python

刘昌翰
2023-03-14
问题内容

我有从熊猫生成的以下形式的字典列表。我想将其转换为json格式。

list_val = [{1.0: 685}, {2.0: 8}]
output = json.dumps(list_val)

但是,json.dumps会引发错误:TypeError:685不可序列化JSON

我猜这是从numpy到python(?)的类型转换问题。

但是,当我使用np.int32(v)转换数组中每个字典的值v时,仍会引发错误。

编辑:这是完整的代码

            new = df[df[label] == label_new] 
            ks_dict = json.loads(content)
            ks_list = ks_dict['variables']
            freq_counts = []

            for ks_var in ks_list:

                    freq_var = dict()
                    freq_var["name"] = ks_var["name"]
                    ks_series = new[ks_var["name"]]
                    temp_df = ks_series.value_counts().to_dict()
                    freq_var["new"] = [{u: np.int32(v)} for (u, v) in temp_df.iteritems()]            
                    freq_counts.append(freq_var)

           out = json.dumps(freq_counts)

问题答案:

看来您是正确的:

>>> import numpy
>>> import json
>>> json.dumps(numpy.int32(685))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/json/__init__.py", line 243, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python2.7/json/encoder.py", line 184, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: 685 is not JSON serializable

这里的可惜的是,numpy的数字__repr__不给你什么任何暗示 键入 他们。int当它们不是( 喘气
)时,它们到处伪装。最终,它似乎json告诉您a
int不可序列化,但实际上,它告诉您此特定的np.int32(或您实际拥有的任何类型)不可序列化。(没有真正的惊喜-没有np.int32
序列化)。这也是为什么您 将其传递给json.dumps之前 不可避免地打印出来的字典看起来也只有整数的原因。


这里最简单的解决方法可能是编写自己的序列化器1:

class MyEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, numpy.integer):
            return int(obj)
        elif isinstance(obj, numpy.floating):
            return float(obj)
        elif isinstance(obj, numpy.ndarray):
            return obj.tolist()
        else:
            return super(MyEncoder, self).default(obj)

您可以这样使用它:

json.dumps(numpy.float32(1.2), cls=MyEncoder)
json.dumps(numpy.arange(12), cls=MyEncoder)
json.dumps({'a': numpy.int32(42)}, cls=MyEncoder)

等等

1或者,您也可以编写默认函数并将其作为defaut关键字参数传递给json.dumps。在这种情况下,您将用替换最后一行raise TypeError,但是…嗯。该类更可扩展:-)



 类似资料:
  • 问题内容: 我有一个对象,或一个对象。如何在java.time框架中将其转换为正确的类型? 我听说我们现在应该使用类型来做大部分业务逻辑。当使用尚未为java.time更新的旧代码时,我需要能够来回转换。什么类型映射到或? 问题答案: 避免使用旧的日期时间类 老式的日期时间类(包括,和)已被证明设计不良,混乱且麻烦。尽可能避免它们。但是,当你必须与这些旧类型进行互操作时,可以在新旧之间进行转换。

  • 问题内容: 我想转换成类型。因为我想将日期设置为。还是有任何支持日期的日期选择器? 问题答案: 假设你的日期选择器使用系统默认时区将日期转换为字符串。

  • 问题内容: 假设class 扩展class 。我碰巧知道 只 包含的实例。有什么方法可以将转换为吗? 看来我唯一的选择是遍历集合,一次转换一个元素,创建一个新集合。鉴于类型擦除使得这在运行时完全不必要,这似乎完全浪费了资源。 问题答案: 您可以通过无类型的List界面进行强制转换:

  • 我正在尝试有一个通量通用转换器使用通用类型在Java 8。我把我的代码建立在这个答案的基础上。其思想基本上是实现这个特定的转换器->: 类型转换器->转换为我想要的任何类型。因此,我正在使用构造函数创建一个类型为的类,并返回一个方法。我想在调用上创建类似这样的多个条目:,但类类型不同。但它甚至对整数也不起作用。 当我使用此单元测试进行测试时,我得到错误:。

  • 我有一个类似于Pairs的类。我有一个特性,可以将这个类转换成Json格式。 当我使用这个特性时,我得到了以下错误,即对于

  • 问题内容: 给定一个NumPy数组,如何将其转换为 原位 ?所以基本上,我想做 而不复制阵列。好大 这样做的原因是我有两种算法来计算。其中一个返回一个数组,另一个返回一个数组(这是两种不同算法所固有的)。所有进一步的计算都假定是的数组。 目前,我在通过调用的C函数中进行了转换。有没有办法在Python中做到这一点? 问题答案: 您可以使用其他dtype创建视图,然后就地复制到视图中: 产量 要显示