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

إلغاء الترميز العلمي في Numpy عند تكوين مصفوفة من قوائم متداخلة

Amer Abdallah

السؤال

لدي قائمة بايثون متداخلة كالتالي:

lst = [
  [2.74, 462, 2366.64, 887558.86, 0.81], 
  [8.55, 17, 1422.3, 3212.0, 0.97], 
  [1.02, 768, 6004865.3, 1960.98, 1.21], 
  [2.4, 2406, 3263822121.3, 1087.9, 1.93], 
  [0.5, 454, 44555062, 155062.72, 0.41], 
  [4.5, 106, 168918, 741272.74, 3.25], 
  [5.7, 787, 3011595.6, 21989471.31, 2.18], 
  [6.3, 117, 12511.4, 1291.0, 1.56], 
  [5.51, 117, 47674230.76, 7181.0, 1.43], 
  [0.85, 771, 1631.96, 2184.08, 0.64]
]

عندما أقوم بتحويل القائمة إلى مصفوفة Numpy كالتالي:

np.array(lst)

أحصل على هذه النتيجة:

array([[2.74000000e+00, 4.62000000e+02, 2.36664000e+03, 8.87558860e+05,
        8.10000000e-01],
       [8.55000000e+00, 1.70000000e+01, 1.42230000e+03, 3.21200000e+03,
        9.70000000e-01],
       [1.02000000e+00, 7.68000000e+02, 6.00486530e+06, 1.96098000e+03,
        1.21000000e+00],
       [2.40000000e+00, 2.40600000e+03, 3.26382212e+09, 1.08790000e+03,
        1.93000000e+00],
       [5.00000000e-01, 4.54000000e+02, 4.45550620e+07, 1.55062720e+05,
        4.10000000e-01],
       [4.50000000e+00, 1.06000000e+02, 1.68918000e+05, 7.41272740e+05,
        3.25000000e+00],
       [5.70000000e+00, 7.87000000e+02, 3.01159560e+06, 2.19894713e+07,
        2.18000000e+00],
       [6.30000000e+00, 1.17000000e+02, 1.25114000e+04, 1.29100000e+03,
        1.56000000e+00],
       [5.51000000e+00, 1.17000000e+02, 4.76742308e+07, 7.18100000e+03,
        1.43000000e+00],
       [8.50000000e-01, 7.71000000e+02, 1.63196000e+03, 2.18408000e+03,
        6.40000000e-01]])

لا أعرف لمذا يتم تغيير شكل الأرقام إلى شكل علمي للغاية، بالرغم من أن هذا الأمر لا يحدث عند عمل مصفوفة من قائمة عادية (ليس قائمة متداخلة):

np.array([4.2, 6.5, 9.142])	# Output: [4.2  6.5  9.142]

ما الذي يسبب هذه المشكلة وكيف يمكنني إيقافها في Numpy حتى لا أقوم بذلك في كل مصفوفة في البرنامج؟

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

Recommended Posts

  • 1

يُمكنك إستخدام 

np.set_printoptions(suppress=True)

لكنها تعمل على الأعداد التي تتكون من 8 خانات على الأكثر مثلاً:

import numpy as np
np.set_printoptions(suppress=True)

lst = [
  [2.74, 462, 2366.64, 887558.86, 0.81], 
  [8.55, 17, 1422.3, 3212.0, 0.97], 
  [1.02, 768, 6004865.3, 1960.98, 1.21], 
  [2.4, 2406, 3263822.3, 1087.9, 1.93], 
  [0.5, 454, 44555062, 155062.72, 0.41], 
  [4.5, 106, 168918, 741272.74, 3.25], 
  [5.7, 787, 3011595.6, 219894.31, 2.18], 
  [6.3, 117, 12511.4, 1291.0, 1.56], 
  [5.51, 117, 47674230.76, 7181.0, 1.43], 
  [0.85, 771, 1631.96, 2184.08, 0.64]
]

lnp = np.array(lst)
print(lnp)

و سيكون الخرج بهذا الشكل:

[[       2.74      462.       2366.64   887558.86        0.81]
 [       8.55       17.       1422.3      3212.          0.97]
 [       1.02      768.    6004865.3      1960.98        1.21]
 [       2.4      2406.    3263822.3      1087.9         1.93]
 [       0.5       454.   44555062.     155062.72        0.41]
 [       4.5       106.     168918.     741272.74        3.25]
 [       5.7       787.    3011595.6    219894.31        2.18]
 [       6.3       117.      12511.4      1291.          1.56]
 [       5.51      117.   47674230.76     7181.          1.43]
 [       0.85      771.       1631.96     2184.08        0.64]]

ومع ذلك ، إذا قمت بتمرير رقم أكبر من 8 خانات، فسيتم فرض الترميز الأسي مرة أخرى في هذه الحالة يُمكنك تمرير معامل ثاني formatter للدالة set_printoptions بهذا الشكل:

np.set_printoptions(suppress=True,
   formatter={'float_kind':'{:0.2f}'.format})

و بهذا الشكل حددنا أنه عند الطباعة الأرقام ستكون عشرية و حددنا عدد الأرقام بعد الفاصلة ب 2 مثال:

import numpy as np
np.set_printoptions(suppress=True, formatter={'float_kind':'{:0.2f}'.format})


lst = [
  [2.74, 462, 2366.64, 887558.86, 0.81], 
  [8.55, 17, 1422.3, 3212.0, 0.97], 
  [1.02, 768, 6004865.3, 1960.98, 1.21], 
  [2.4, 2406, 3263822121.3, 1087.9, 1.93], 
  [0.5, 454, 44555062, 155062.72, 0.41], 
  [4.5, 106, 168918, 741272.74, 3.25], 
  [5.7, 787, 3011595.6, 21989471.31, 2.18], 
  [6.3, 117, 12511.4, 1291.0, 1.56], 
  [5.51, 117, 47674230.76, 7181.0, 1.43], 
  [0.85, 771, 1631.96, 2184.08, 0.64]
]

lnp = np.array(lst)
print(lnp)

و سيكون الخرج:

[[2.74 462.00 2366.64 887558.86 0.81]
 [8.55 17.00 1422.30 3212.00 0.97]
 [1.02 768.00 6004865.30 1960.98 1.21]
 [2.40 2406.00 3263822121.30 1087.90 1.93]
 [0.50 454.00 44555062.00 155062.72 0.41]
 [4.50 106.00 168918.00 741272.74 3.25]
 [5.70 787.00 3011595.60 21989471.31 2.18]
 [6.30 117.00 12511.40 1291.00 1.56]
 [5.51 117.00 47674230.76 7181.00 1.43]
 [0.85 771.00 1631.96 2184.08 0.64]]
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

من خلال Numpy يمكننا التحكم في شكل طباعة المصفوفات عن طريق التابع numpy.set_printoptions حيث أن الوسيط suppress يستطيع التحكم في ذلك، فضبطه على True سوف يلغي هذا الترميز:

import numpy as np
arr = np.array([[3.1415, 2.7182],[6.6260e-34, 6.6743e-11]])
#نتحكم بعدد الأرقام بعد الفاصلة precision من خلال الوسيط 
np.set_printoptions(precision=2)
print(arr)
"""
[[3.14e+00 2.72e+00]
 [6.63e-34 6.67e-11]]
"""
np.set_printoptions(suppress=True) # إلغاء الترميز الأسي
print(arr)
"""
[[3.14 2.72]
 [0.   0.  ]]
"""
np.set_printoptions(suppress=False)
print(arr)
"""
[[3.14e+00 2.72e+00]
 [6.63e-34 6.67e-11]]
"""

لكن هذا لاينفع مع الأعداد التي تحوي على أكثر من 8 أرقام، وأي محاولة لقمع الترميز الأسي في هذه الحالة لن يكون خياراً جيداً.

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

  • 0

يمكنك بالطبع عن طريق تغيير إعدادات الطباعة من خلال set_printoptions  بواسطة المعامل suppress=True كما في التعليقات السابقة ولكن أحياناً تحتاج لتنفيذ هذه الإعدادت locally ويمكنك عمل ذلك من خلال context manager لذلك يكون الكود كالتالي

x = np.random.random(10)
with np.printoptions(precision=3, suppress=True):
    print(x)
    # [ 0.073  0.461  0.689  0.754  0.624  0.901  0.049  0.582  0.557  0.348]

لاحظ أنه إذا قمت بالطباعة خارج هذا ال context manager سترجع إعدادات الطباعة كما كانت

print(x)    
# [ 0.07334334  0.46132615  0.68935231  0.75379645  0.62424021  0.90115836
#   0.04879837  0.58207504  0.55694118  0.34768638]

 

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...