English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
يتم استخدام التعميم في NumPy بشكل رئيسي أثناء العمليات الحسابية لمعالجة مصفوفات بأشكال مختلفة. تحت تأثير بعض القيود، يتم تكرار المصفوفة الأصغر على المصفوفة الأكبر لتكون متوافقة في الأبعاد.
عادةً ما يتم تنفيذ عمليات NumPy على مصفوفات على أساس عناصرها الفردية. في الحالة البسيطة، يجب أن تكون المصفوفتان متشابهتين تمامًا في الشكل، مثل المثال التالي:
>>> import numpy as np >>> a = np.array([1, 2, 3]) >>> b = np.array([2, 2, 2]) >>> a * b مصفوفة ([ 2, 4, 6])
عندما تكون أشكال المصفوفتين المشاركة في العمليات مختلفة، يتم تشغيل آلية التعميم تلقائيًا في NumPy. مثلًا:
>>> import numpy as np >>> a = np.array([[ 0, 0, 0], [10,10,10], [20,20,20], [30,30,30]]) >>> b = np.array([1,2,3]) >>> print(a + b) [[ 1 2 3] [11 12 13] [21 22 23] [31 32 33]]
توضح الصورة التالية كيفية تمرير مصفوفة b مع التعميم مع مصفوفة a.
إضافة مصفوفة د维انية بحجم 4x3 إلى مصفوفة عمودية بحجم 3، يعادل تكرار مصفوفة b أربعة مرات في العمودي قبل الأداء:
>>> import numpy as np >>> a = np.array([[ 0, 0, 0], [10,10,10], [20,20,20], [30,30,30]]) >>> b = np.array([1,2,3]) >>> bb = np.tile(b, (4, 1)) # تكرار أبعاد b >>> print(a + bb) [[ 1 2 3] [11 12 13] [21 22 23] [31 32 33]]
عند تشغيلها على المصفوفتين، يقوم NumPy بمقارنة أشكالها عنصرًا عنصرًا. يبدأ من الأبعاد المتاخمة، ويستمر نحو الأمام. تكون الأبعاد متوافقة عندما
هم متساويين، أو
أحد الأبعاد هو 1
إذا لم تكن هذه الشروط مستوفيًا، فإنه يتم إلقاء استثناء ValueError: operands could not be broadcast together، مما يشير إلى أن الأبعاد غير متوافقة. حجم المصفوفة الناتجة هو غير واحد على طول كل محور من المدخلات.
لا تحتاج المجموعات إلى أن تكون ذات أبعاد متشابهة. على سبيل المثال، إذا كان لديك مصفوفة قيم RGB 256x256x3، وكانت لديك الرغبة في تقليل قيم كل لون بشكل مختلف، يمكنك ضرب الصورة في مصفوفة عمودية تحتوي على ثلاثة قيم. يتم ترتيب الأبعاد في نهاية المصفوفات وفقًا للقواعد المتعلقة بالتعميم، مما يشير إلى أنها متوافقة:
Image (3d array): 256 x 256 x 3 Scale (1d array): 3 Result (3d array): 256 x 256 x 3
当一个比较的任何尺寸为1时,使用另一个尺寸。换句话说,尺寸为1的尺寸被拉伸或“复制”以匹配另一个尺寸。在以下示例中,A和B数组都具有长度为1的轴,在广播操作期间会扩展为更大的大小:
A (4d array): 8 x 1 x 6 x 1 B (3d array): 7 x 1 x 5 Result (4d array): 8 x 7 x 6 x 5
以下是一些实例:
A (2d array): 5 x 4 B (1d array): 1 Result (2d array): 5 x 4 A (2d array): 5 x 4 B (1d array): 4 Result (2d array): 5 x 4 A (3d array): 15 x 3 x 5 B (3d array): 15 x 1 x 5 Result (3d array): 15 x 3 x 5 A (3d array): 15 x 3 x 5 B (2d array): 3 x 5 Result (3d array): 15 x 3 x 5 A (3d array): 15 x 3 x 5 B (2d array): 3 x 1 Result (3d array): 15 x 3 x 5
以下是不广播的形状示例:
A (1d array): 3 B (1d array): 4 # trailing dimensions do not match A (2d array): 2 x 1 B (3d array): 8 x 4 x 3 # trailing dimensions do not match
实践中广播的一个实例:
>>> import numpy as np >> x = np.arange(4) >> xx = x.reshape(4, 1) >> y = np.ones(5) >> z = np.ones((3, 4)) >>> x.shape (4,) >> y.shape (5,) >> x + y ValueError: operands could not be broadcast together with shapes (4,) (5,) >> xx.shape (4, 1) >> y.shape (5,) >> (xx + y).shape (4, 5) >> xx + y array([[1., 1., 1., 1., 1.], [ 2., 2., 2., 2., 2.] [ 3., 3., 3., 3., 3.], [ 4., 4., 4., 4., 4.]] >>> x.shape (4,) >>> z.shape (3, 4) >>> (x + z).shape (3, 4) >>> x + z array([[ 1., 2., 3., 4.], [ 1., 2., 3., 4.], >>> [ 1., 2., 3., 4.]]
يقدم بث المجموعات طريقة مريحة للحصول على الخارجية بين مجموعتين (أو أي عملية خارجية أخرى). يظهر المثال التالي عملية الخارجية بين مجموعتين 1-d:
>>> import numpy as np >>> a = np.array([0.0, 10.0, 20.0, 30.0]) >>> b = np.array([1.0, 2.0, 3.0]) >>> a[:, np.newaxis] + b array([[ 1., 2., 3.], [ 11., 12., 13.], [ 21., 22., 23.], [ 31., 32., 33.]])
هنا newaxisاستخدام دالة مؤشر المجموعة لدمج محور جديد ا ، لجعلها ثنائية 4x1مجموعة. سيتم 4x1مجموعة مع شكل (3,)من بالدمج، لإنشاء 4x3مجموعة.