English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
النسخ هو نسخة كاملة من البيانات، إذا قمنا بتعديل النسخ، فإن ذلك لا يؤثر على البيانات الأصلية، ويكون الذاكرة في موقع مختلف.
العرض هو اسم أو مرجع للبيانات، يمكن الوصول إليه وتعديله من خلال هذا الاسم أو المرجع، ولكن لا يتم إنشاء نسخة من البيانات. إذا قمنا بتعديل العرض، فإن ذلك يؤثر على البيانات الأصلية، ويكون الذاكرة في نفس الموقع.
الفرق الرئيسي بين النسخ والعرض هو أن النسخ هو مصفوفة جديدة، بينما العرض هو عرض للمصفوفة الأصلية.النسخ يمتلك البيانات، أي تغيير في النسخ لا يؤثر على المصفوفة الأصلية، وأي تغيير في المصفوفة الأصلية لا يؤثر على النسخ.العرض لا يمتلك البيانات، أي تغيير في العرض يؤثر على المصفوفة الأصلية، وأي تغيير في المصفوفة الأصلية يؤثر على العرض.
1، عمليات قطع numpy تعود عرضًا للبيانات الأصلية.2، دعوة دالة view() من ndarray لإنشاء عرض.
عمليات قطع سلسلة Python، دعوة دالة deepCopy().دعوة دالة copy() من ndarray لإنشاء نسخة.
تخصيص بسيط لا يخلق نسخة من كائن المصفوفة. على العكس من ذلك، يستخدم نفس id() من المصفوفة الأصلية للاستدلال عليه. id() يعود بمعرف كائن Python، يشبه مؤشر في C. بالإضافة إلى ذلك، أي تغيير في مصفوفة يظهر في المصفوفة الأخرى. على سبيل المثال، تغيير شكل المصفوفة يغير شكل المصفوفة الأخرى.
>>> import numpy as np >>> a = np.arange(6) >>> print ('مجموعتنا هي:',a) مجموعتنا هي: [0 1 2 3 4 5] >>> print ('دعوة دالة id() :',id(a)) دعوة دالة id() : 4553321728 >>> b = a >>> print(b) [0 1 2 3 4 5] >>> print('b يحتوي على نفس id():', id(b)) b يحتوي على نفس id() 4553321728 >>> b.shape = 3,2 >>> print(b) [[0 1] [2 3] [4 5]] >>> print(a) [[0 1] [2 3] [4 5]] >>>
ndarray.view() سينشئ كائنًا جديدًا للمجموعة، ويجب أن لا يؤثر تغيير أبعاد المجموعة الجديدة على أبعاد البيانات الأصلية.
import numpy as np # في البداية كان a هو مجموعة 3x2 a = np.arange(6).reshape(3,2) print('مصفوفة a:') print(a) print ('إنشاء عرض a:') b = a.view() print(b) print ('id() لكل مجموعتين مختلفة:') print ('id a():') print (id(a)) print ('id b():') print (id(b)) # تعديل شكل b لن يؤثر على a b.shape = 2,3 print ('شكل b:') print(b) print ('شكل a:') print(a)
النتيجة الصادرة هي:
مصفوفة a: [[0 1] [2 3] [4 5]] إنشاء عرض a: [[0 1] [2 3] [4 5]] id() لكل مجموعتين مختلفة: id a() 4314786992 id b() 4315171296 شكل b: [[0 1 2] [3 4 5]] شكل a: [[0 1] [2 3] [4 5]]
استخدام قطع لإنشاء عرض وتعديل البيانات يؤثر على المجموعة الأصلية:
import numpy as np arr = np.arange(12) print ('مجموعتنا:') print (arr) print ('إنشاء قطعة:') a=arr[2:] b=arr[2:] a[1]=123456 b[2]=23445 print(arr) print(id(a),id(b),id(arr[3:]))
النتيجة الصادرة هي:
مجموعتنا: [ 0 1 2 3 4 5 6 7 8 9 10 11] إنشاء قطعة: [ 0 1 2 123456 23445 5 6 7 8 9 10 11] 4669930672 4444330304 4670012352 Process finished with exit code 0
متغيرات a,b جزء من عرض arr، والتعديلات على العرض ستؤثر مباشرة على البيانات الأصلية. ولكننا نلاحظ id a,b، إنهم مختلفون، مما يعني أن العرض يوجه إلى البيانات الأصلية، ولكنهم يختلفون عن الاستدلال المخصوص.
وظيفة ndarray.copy() تخلق نسخة. لا يؤثر تعديل البيانات في النسخة على البيانات الأصلية، فهي ليست في نفس الموقع في الذاكرة.
import numpy as np a = np.array([[10,10], [2,3], [4,5]]) print('مصفوفة a:') print(a) print('إنشاء نسخة عميقة من a:') b = a.copy() print('مصفوفة b:') print(b) # b لا تتشارك مع a أي شيء print('هل يمكننا كتابة b لتحرير a؟') print(b is a) print('عدل محتوى b:') b[0,0] = 100 print('عدل مصفوفة b بعد تعديلها:') print(b) print('a يبقى كما هي:') print(a)
النتيجة الصادرة هي:
مصفوفة a: [[10 10] [ 2 3] [ 4 5]] إنشاء نسخة عميقة من a: مصفوفة b: [[10 10] [ 2 3] [ 4 5]] هل يمكننا كتابة b لتحرير a؟ False عدل محتوى b: عدل مصفوفة b بعد تعديلها: [[100 10] [ 2 3] [ 4 5]] a تبقى كما هي: [[10 10] [ 2 3] [ 4 5]]