اذهب إلى المحتوى
  • 0

خطأ NumPy array is not JSON serializable في numpy

Fahmy Mostafa

السؤال

 

بعد إنشاء مصفوفة Numpy وحفظها كـ  Django context variable، أتلقى الخطأ التالي عند تحميل صفحة الويب:

array([   0,  239,  479,  717,  952, 1192, 1432, 1667], dtype=int64) is not JSON serializable

 

ماذا الذي يعنيه هذا الخطأ؟ وهل يجب أن أقوم بتغير نوع المصفوفة من خلال مكتبة json حتى أتمكن من التعامل مع هذا الكائن؟

تم التعديل في بواسطة Fahmy Mostafa
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

يجب أن تقوم بتحويل المصفوفة الى تنسيق JSON , يمكنك فعل ذلك كالتالي 

class NumpyEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.ndarray):
            return obj.tolist()
        return json.JSONEncoder.default(self, obj)

a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.shape)
json_dump = json.dumps({'a': a, 'aa': [2, (2, 3, 4), a], 'bb': [2]}, cls=NumpyEncoder)
print(json_dump)

وسوف يكون الناتج كالآتي

(2, 3)
{"a": [[1, 2, 3], [4, 5, 6]], "aa": [2, [2, 3, 4], [[1, 2, 3], [4, 5, 6]]], "bb": [2]}

لاستعادتها الى شكل مصفوفة يمكنك استخدام الكود التالي

json_load = json.loads(json_dump)
a_restored = np.asarray(json_load["a"])
print(a_restored)
print(a_restored.shape)

سوف يكون شكل الناتج هكذا

[[1 2 3]
 [4 5 6]]
(2, 3)

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

يجب عليك تخزين numpy.ndarray بتنسيق JSON أو أي تركيب من ال nested-list:

import json
import numpy as np
class NumpyEncoder(json.JSONEncoder):
    # مشفر جيسون خاص للنوع نمباي
    def default(self, obj):
        if isinstance(obj, np.integer):
            return int(obj)
        elif isinstance(obj, np.floating):
            return float(obj)
        elif isinstance(obj, np.ndarray):
            return obj.tolist()
        return json.JSONEncoder.default(self, obj)
dumped = json.dumps(data, cls=NumpyEncoder)
with open(path, 'w') as f:
    json.dump(dumped, f)

حيث أن JSON هو "Javascript Object Notation" وبالتالي يمكنه فقط تمثيل التركيبات الأساسية من لغة جافا سكريبت: كائنات (مماثلة لل dict ببايثون) ، ومصفوفات (مماثلة لقوائم بيثون) ، وأرقام ، وبيانات بوليانية، وسلاسل ، و nulls. أما المصفوفات Numpy ليست أياً من هذه الأشياء، وبالتالي لا يمكن تحويلها إلى تسلسل "serialised" في JSON. لذلك نلجأ للطريقة السابقة

 

تم التعديل في بواسطة Ali Haidar Ahmad
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

الخطأ أن المصفوفة ليست JSON لهذا يجب عليك تحويل المصفوفة أولاً

 جرب استخدام دالة ".tolist ()" في المصفوفة أولاً ، على النحو التالي:

import numpy as np
import codecs, json 

a = np.arange(10).reshape(2,5) 
b = a.tolist() 
file_path = "/path.json" ## متغير المسار
json.dump(b, codecs.open(file_path, 'w', encoding='utf-8'), separators=(',', ':'), sort_keys=True, indent=4) ### هذا يقوم بحفظ المصفوفة على شكل json

من أجل إرجاع المصفوفة الى ماكانت عليه ، استخدم:

obj_text = codecs.open(file_path, 'r', encoding='utf-8').read()
b_new = json.loads(obj_text)
a_new = np.array(b_new)
رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...