English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

نسخ مصفوفة NumPy والرؤى

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

الفرق بين النسخ والعرض

الفرق الرئيسي بين النسخ والعرض هو أن النسخ هو مصفوفة جديدة، بينما العرض هو عرض للمصفوفة الأصلية.النسخ يمتلك البيانات، أي تغيير في النسخ لا يؤثر على المصفوفة الأصلية، وأي تغيير في المصفوفة الأصلية لا يؤثر على النسخ.العرض لا يمتلك البيانات، أي تغيير في العرض يؤثر على المصفوفة الأصلية، وأي تغيير في المصفوفة الأصلية يؤثر على العرض.

تحدث العروض عادةً في:

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]]