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

السؤال

نشر

ما هو الفرق بين دالات array() و asarray() في Numpy؟ ومتى يجب استخدام أحدهما دون الآخر؟ يبدو أنها تولد مخرجات متطابقة لجميع المدخلات التي يمكنني التفكير فيها. كما توجد دالات أخرى مشابهة مثل asanyarray ولكني لم أدرسها بعد.

فيما تستخدم هذه الدالات؟ أعتقد أنها ليست مجرد أسماء بديلة alias لدالة array؟ صحيح؟

Recommended Posts

  • 1
نشر (معدل)

يمكن لكل من array و asarray تحويل البيانات المهيكلة "structured data" إلى ndarray ، ولكن الاختلاف الرئيسي هو أنه عندما يكون مصدر البيانات ndarray ، ستظل المصفوفة تنسخ نسخة ، وتحتل ذاكرة جديدة ، لكن asarray لن تفعل ذلك. عند الإدخال كقائمة ، يكون نوع البيانات الأصلي الذي يتم تحويله عبارة عن قائمة:

import numpy
x=[[0,5],[8,5]]
v = numpy.asarray(x)
i = numpy.array(x)
x[0] = 5
print(x) #[5, [8, 5]]
print(i)
'''
[[0 5]
 [8 5]]
'''
print(v)
'''
[[0 5]
 [8 5]]
'''

من هذا يمكننا أن نرى أن ال array هو نفسه asarray ، أي يقومان بتحويل المدخلات إلى تنسيق Matrix. وعندما يكون الدخل عبارة عن قائمة، فإن تغيير قيمة في القائمة لا يؤثر على القيمة المحولة إلى المصفوفة. أما عندما يكون الإدخال عبارة عن مصفوفة:

import numpy as np
 
array=np.random.random((3,3))
print(array.dtype) # float64
x=np.array(array,dtype='float64')
t=np.asarray(array,dtype='float64')
array[1]=2
print(array)
'''
[[0.14427798 0.24129013 0.3114457 ]
 [2.         2.         2.        ]
 [0.18134186 0.29733322 0.38294914]]
'''
print(x)
'''
[[0.14427798 0.24129013 0.3114457 ]
 [0.21828251 0.48710077 0.07849822]
 [0.18134186 0.29733322 0.38294914]]
'''
print(t)
'''
[[0.14427798 0.24129013 0.3114457 ]
 [2.         2.         2.        ]
 [0.18134186 0.29733322 0.38294914]]
'''
print(x is a) # False
print(t is a) # True

من النتائج المذكورة أعلاه يمكننا أن نرى الفرق بين np.array و np.asarray. عندما يكون الإدخال عبارة عن مصفوفة ، ستقوم np.array بإنشاء مساحة ذاكرية وتنسخ البيانات فيها. أي سيكون لها مساحة ذاكرة خاصة بها، لذلك يتغير الخرج الخاص ب np.array مع الدخل، والتابع .asarray يزيد من العداد الذي يشير إلى t  ويشير إلى المصفوفة، بحيث عندما تتغير المصفوفة الأصلية ، سيتغير ناتج np.asarray أيضًا.

تم التعديل في بواسطة Ali Haidar Ahmad
  • 0
نشر

توجد الاختلافات بشكل أساسي عند إرجاع المدخلات دون تغيير، بدلا من إنشاء مجموعة جديدة كنسخة. بمعني أوضح أن الاختلاف الاساسي يكمن في استخدام الذاكرة المؤقتة memory حيث أن:

  • array: تقوم بعمل نسخة من المصوفة التي تحتويها.
  • asarray: تستخدم المساحة الاصلية الخاصة بالمصفوفة.
  • asanyarray : تستخدم المساحة الاصلية الخاصة بالمصفوفة،  asanyarray سوف تعيد مصفوفة على النوع  ndarray

أنظر المثال التالي:

  • a= np.array([1,2,3])
    b=np.array(a) # Open up a new space, make a copy
    c=np.asarray(a) # Still use the original space
    d=np.asanyarray(a) # Still use the original space
    a[1]=0
    print("a:",a)
    print("b:",b)
    print("c:",c)
    print("d:",d)
    
    >>>
    a: [1 0 3]
    b: [1 2 3]
    c: [1 0 3]
    d: [1 0 3]

    أنظر كذلك المثال القادم لتوضيح الفرق في انواع المصفوفات:

  • دعنا ننشئ مصفوفة كالتالي:

    >>> A = numpy.matrix(numpy.ones((3,3)))
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])

    أستخدم  numpy.array لتعديل A. لن يعمل ذلك لأنك تعدل نسخة:

    >>> numpy.array(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])

    الان استخدم numpy.asarray لتعديل A، هذا سوف يعمل لانك تقوم بتعديل A نفسها:

    >>> numpy.asarray(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 2.,  2.,  2.]])

    كذلك array() يقدم مجموعة واسعة من الخيارات أوسع من الدوال الاخرى.

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...