• 0

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

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

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 حتى لا أقوم بذلك في كل مصفوفة في البرنامج؟

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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
1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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]

 

انشر على الشّبكات الاجتماعية


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

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن