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

السؤال

نشر

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

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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...