English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
يُطبق تبث NumPy بشكل رئيسي أثناء العمليات الحسابية على المصفوفات التي تحتوي على أبعاد مختلفة. تتعرض المصفوفات الأصغر في المصفوفة الأكبر لتبث، لتكون متوافقة في الأبعاد.
تتم عمليات NumPy عادةً على أساس عناصر المصفوفات. في الحالة الأبسط، يجب أن تكون المصفوفتان متساويتين تمامًا في الشكل، مثل المثال التالي:
مثال >>> a = np.array([1, 2, 3]) >>> b = np.array([2, 2, 2]) >>> a * b مصفوفة([ 2, 4, 6])
عندما تكون شكل المصفوفتين المشاركتين في العمليات مختلفة، يبدأ NumPy في التبث التلقائي. مثل:
مثال >>> 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 أربعة مرات في البعد الثنائي قبل التشغيل:
مثال >>> 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، مما يشير إلى أن المصفوفة تحتوي على أبعاد غير متوافقة. حجم المصفوفة الناتجة هو أن الحجم ليس 1 في كل محور من المحاور المدخلة.
لا يتطلب أن يكون المثبت متساوياً في أبعاده. على سبيل المثال، إذا كان لديك مصفوفة قيم 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 #尾部维度不匹配 A (2d array): 2 x 1 B (3d array): 8 x 4 x 3 #倒数第二个维度不匹配
实践中广播的一个实例:
مثال >> x = np.arange(4) >> xx = x.reshape(4, 1) >> y = np.ones(5) >> z = np.ones((3, 4)) [4., 4., 4., 4., 4.] >> x.shape >> 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.], [2., 2., 2., 2., 2.], [3., 3., 3., 3., 3.], [4., 4., 4., 4., 4.] >> x.shape (4,) >> (x + z).shape >> z.shape >> (x + z).shape (3, 4) >> x + z array([[1., 2., 3., 4.], [1., 2., 3., 4.],
[1., 2., 3., 4.]]
مثال >> 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مجموعة.