English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
يقدم م迭代ر NumPy numpy.nditer طريقة مرونة للاستفادة من عناصر المصفوفة الواحدة أو أكثر.
أبسط المهام التي يمكن لل迭代ر القيام بها هي الوصول إلى عناصر المصفوفة.
سنستخدم الآن دالة arange() لإنشاء مصفوفة 2x3، ونقوم بتكرارها باستخدام nditer.
import numpy as np a = np.arange(12).reshape(2,6) print('العدد الأصلي هو:') print(a) print('\n') اطبع ('الناتج المتكرر للعناصر:') للمحصول على x في np.nditer(a): print(x, end=" ")
النتيجة الصادرة هي:
العدد الأصلي هو: [[0 1 2 3 4 5]] [6 7 8 9 10 11] الناتج المتكرر للقائمة التالية هو: 0 1 2 3 4 5 6 7 8 9 10 11
هذا المثال ليس باستخدام الترتيب القياسي C أو Fortran، بل يتم اختيار الترتيب الذي يتوافق مع ترتيب تخزين النمط في الذاكرة، ويتم هذا لرفع كفاءة الوصول، والترتيب الافتراضي هو الترتيب الأولي للصف (row-major order، أو C-order).
هذا يعكس الوضع الافتراضي حيث يكفي الوصول إلى كل عنصر دون النظر في الترتيب المحدد. يمكننا رؤية هذا من خلال تكرار النقل العكسي للنمط من خلال التكرار، وتقارن ذلك مع طريقة الوصول إلى النقل العكسي للنمط باستخدام copy بترتيب C، مثل المثال التالي:
import numpy as np a = np.arange(12).reshape(2,6) لـ x في np.nditer(a.T): print(x, end=" ") print('\n') لـ x في np.nditer(a.T.copy(order='C')): print(x, end=" ")
النتيجة الصادرة هي:
0 1 2 3 4 5 6 7 8 9 10 11 0 6 1 7 2 8 3 9 4 10 5 11
من خلال المثال السابق، يمكن ملاحظة أن ترتيب a و a.T هو نفسه، أي أن ترتيب التخزين في الذاكرة هو نفسه، ولكن a.T.copy(order = 'C') النتيجة من الاستدعاء المختلفة، لأنها ليست مثل النوعين الآخرين من طرق التخزين، والترتيب الافتراضي هو الوصول إلى الصف.
لـ x في np.nditer(a, order='F'): ترتيب Fortran، هو الترتيب الأولي للعمود؛لـ x في np.nditer(a.T, order='C'): ترتيب C، هو الترتيب الأولي للصف;
import numpy as np a = np.arange(0,100,5) a = a.reshape(4,5) print('العدد الأصلي هو:') print(a) print('\n') اطبع ('النقل العكسي للنمط الأصلي هو:') b = a.T print(b) print('\n') اطبع ('بترتيب C') c = b.copy(order='C') اطبع (c) لـ x في np.nditer(c): print(x, end=" ") print('\n') اطبع ('بترتيب F') c = b.copy(order='F') اطبع (c) لـ x في np.nditer(c): print(x, end=" ")
النتيجة الصادرة هي:
العدد الأصلي هو: [[0 5 10 15 20] [25 30 35 40 45] [50 55 60 65 70] [75 80 85 90 95]] النقل العكسي للنمط الأصلي هو: [[0 25 50 75] [5 30 55 80] [10 35 60 85] [15 40 65 90] [20 45 70 95]] ترتيب بنمط C: [[0 25 50 75] [5 30 55 80] [10 35 60 85] [15 40 65 90] [20 45 70 95]] 0 25 50 75 5 30 55 80 10 35 60 85 15 40 65 90 20 45 70 95 ترتيب بنمط F: [[0 25 50 75] [5 30 55 80] [10 35 60 85] [15 40 65 90] [20 45 70 95]] 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95
يمكن من خلال إعداد صريح، إجبار nditer على استخدام ترتيب معين:
import numpy as np a = np.arange(0,100,5) a = a.reshape(4,5) print('العدد الأصلي هو:') print(a) print('\n') اطبع ('بترتيب C') لـ x في np.nditer(a, order = 'C'): اطبع (x, end=", ", ) print('\n') اطبع ('بترتيب F') لـ x في np.nditer(a, order = 'F'): print(x, end=" ")
النتيجة الصادرة هي:
العدد الأصلي هو: [[0 5 10 15 20] [25 30 35 40 45] [50 55 60 65 70] [75 80 85 90 95]] ترتيب بنمط C: 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, ترتيب بنمط F: 0 25 50 75 5 30 55 80 10 35 60 85 15 40 65 90 20 45 70 95
يملك كائن nditer معامل اختياري op_flags. بشكل افتراضي، يعتبر nditer العدد الذي سيتم مروره عبره كعدد قارئ فقط (read-only)، ولكي يتم تعديل قيم عناصر العدد أثناء مروره، يجب تحديد نمط read-write أو write-only.
import numpy as np a = np.arange(0,100,5) a = a.reshape(4,5) print('العدد الأصلي هو:') print(a) print('\n') for x in np.nditer(a, op_flags=['readwrite']): x[...]=2*x print('العدد المعدل هو:') print(a)
النتيجة الصادرة هي:
العدد الأصلي هو: [[0 5 10 15 20] [25 30 35 40 45] [50 55 60 65 70] [75 80 85 90 95]] العدد المعدل هو: [[0 10 20 30 40] [0 50 60 70 80 90] [100 110 120 130 140] [150 160 170 180 190]]
يملك بناء nditer دالة معامل flags يمكن أن يأخذ القيم التالية:
الم 参数 | الوصف |
c_index | يمكن تتبع فهرسة C |
f_index | يمكن تتبع فهرسة Fortran |
multi-index | يمكن تتبع نوع فهرسة في كل تكرار |
external_loop | القيم المقدمة هي مصفوفة خطية تحتوي على عدة قيم، وليست مصفوفة صفرية. |
في المثال التالي، يمر محول الاستدعاء عبر كل عمود، وي组合 إلى مصفوفة خطية.
import numpy as np a = np.arange(0,100,5) a = a.reshape(4,5) print('العدد الأصلي هو:') print(a) print('\n') print('العدد المعدل هو:') for x in np.nditer(a, flags=['external_loop'], order='F'): print(x, end=" ")
النتيجة الصادرة هي:
العدد الأصلي هو: [[0 5 10 15 20] [25 30 35 40 45] [50 55 60 65 70] [75 80 85 90 95]] العدد المعدل هو: [0 25 50 75] [5 30 55 80] [10 35 60 85] [15 40 65 90] [20 45 70 95]
إذا كانت المصفوفتان قابلة للـ broadcasting، يمكن للـ nditer أن يتكرر كلاهما في نفس الوقت. افترض أن حجم مصفوفة a هو 3x4، وحجم مصفوفة b هو 1x4، فإنه يمكن استخدام الم迭代ر (تم تثبيت مصفوفة b لحجم مصفوفة a).
import numpy as np a = np.arange(0, 60, 5) a = a.reshape(3, 4) print('المصفوفة الأولى هي:') print(a) print('\n') print('المصفوفة الثانية هي:') b = np.array([1, 2, 3, 4], dtype=int) print(b) print('\n') print('مصفوفة التعديل الجديدة هي:') for x, y in np.nditer([a, b]): print("%d:%d" % (x, y), end=" ")
النتيجة الصادرة هي:
المصفوفة الأولى هي: [[ 0 5 10 15] [20 25 30 35] [40 45 50 55] المصفوفة الثانية هي: [1 2 3 4] مصفوفة التعديل الجديدة هي: 0:1, 5:2, 10:3, 15:4, 20:1, 25:2, 30:3, 35:4, 40:1, 45:2, 50:3, 55:4,