نامباي
رسم بياني لدالة y=sin(x)، تم إنشاؤه باستخدام مكتبات NumPy و Matplotlib | |
| المؤلف(ون) الأصلي(ون) | ترافيس أوليفانت |
|---|---|
| المطور(ون) | مشروع مجتمعي |
| الإصدار الأولي | كما هو الحال في Numeric، 1995 ؛ كما هو الحال في NumPy، 2006 |
| إصدار مستقر | 2.2.2 [1]
/ 18 يناير 2025 |
| مستودع |
|
| مكتوب في | بايثون ، سي |
| نظام التشغيل | متعدد المنصات |
| يكتب | التحليل العددي |
| رخصة | بي إس دي [2] |
| موقع إلكتروني | numpy.org |
NumPy (تنطق / ˈnʌmpaɪ / NUM -py ) هي مكتبة للغة برمجة بايثون ، وتضيف دعمًا للمصفوفات والمصفوفات الكبيرة متعددة الأبعاد ، إلى جانب مجموعة كبيرة من الوظائف الرياضية عالية المستوى للعمل على هذه المصفوفات. [3] تم إنشاء سلف NumPy، Numeric، في الأصل بواسطة Jim Hugunin بمساهمات من العديد من المطورين الآخرين. في عام 2005، أنشأ Travis Oliphant NumPy من خلال دمج ميزات Numarray المنافسة في Numeric، مع تعديلات مكثفة. NumPy هو برنامج مفتوح المصدر ولديه العديد من المساهمين. يتم رعاية NumPy ماليًا من قبل NumFOCUS. [4]
تاريخ
مصفوفة-توقيع
لم تكن لغة برمجة بايثون مصممة في الأصل للحوسبة الرقمية، لكنها جذبت انتباه المجتمع العلمي والهندسي في وقت مبكر. في عام 1995، تأسست مجموعة الاهتمامات الخاصة (SIG) matrix-sig بهدف تحديد حزمة حوسبة المصفوفات ؛ وكان من بين أعضائها مصمم بايثون وصيانته Guido van Rossum ، الذي وسّع بناء جملة بايثون (وخاصة بناء جملة الفهرسة [5] ) لتسهيل حوسبة المصفوفات . [6]
رقمي
تم تنفيذ حزمة مصفوفة بواسطة جيم فولتون، ثم تم تعميمها [ بحاجة لشرح إضافي ] بواسطة جيم هوغونين وتم تسميتها Numeric [6] (المعروفة أيضًا باسم "امتدادات Python العددية" أو "NumPy")، مع تأثيرات من عائلة لغات APL ، Basis، MATLAB ، FORTRAN ، S و S+ ، وغيرها. [7] [8] انضم هوغونين، وهو طالب دراسات عليا في معهد ماساتشوستس للتكنولوجيا (MIT)، [8] : 10 إلى مؤسسة المبادرات البحثية الوطنية (CNRI) في عام 1997 للعمل على JPython ، [6] تاركًا بول دوبوا من مختبر لورانس ليفرمور الوطني (LLNL) لتولي منصب المشرف. [8] : 10 ومن المساهمين الأوائل الآخرين ديفيد آشر وكونراد هينسن وترافيس أوليفانت . [8] : 10
مجموعة رقمية
تم كتابة حزمة جديدة تسمى Numarray كبديل أكثر مرونة لـ Numeric. [9] مثل Numeric، أصبحت الآن قديمة أيضًا. [10] [11] كانت عمليات Numarray أسرع للمصفوفات الكبيرة، لكنها كانت أبطأ من Numeric للمصفوفات الصغيرة، [12] لذلك تم استخدام كلتا الحزمتين بالتوازي لبعض الوقت لحالات استخدام مختلفة. تم إصدار الإصدار الأخير من Numeric (v24.2) في 11 نوفمبر 2005، بينما تم إصدار الإصدار الأخير من numarray (v1.5.2) في 24 أغسطس 2006. [13]
كانت هناك رغبة في إدخال Numeric إلى مكتبة Python القياسية، لكن Guido van Rossum قرر أن الكود غير قابل للصيانة في حالته آنذاك. [ متى؟ ] [14]
نامباي
في أوائل عام 2005، أراد مطور NumPy Travis Oliphant توحيد المجتمع حول حزمة مصفوفة واحدة ونقل ميزات Numarray إلى Numeric، وأصدر النتيجة باسم NumPy 1.0 في عام 2006. [9] كان هذا المشروع الجديد جزءًا من SciPy . لتجنب تثبيت حزمة SciPy الكبيرة فقط للحصول على كائن مصفوفة، تم فصل هذه الحزمة الجديدة وتسميتها NumPy. تمت إضافة دعم Python 3 في عام 2011 مع إصدار NumPy 1.5.0. [15]
في عام 2011، بدأت PyPy تطوير تنفيذ لواجهة برمجة تطبيقات NumPy لـ PyPy. [16] اعتبارًا من عام 2023، لم تكن متوافقة تمامًا مع NumPy. [17]
سمات
يستهدف NumPy تنفيذ مرجع CPython لـ Python، وهو مفسّر بايت كود غير محسّن . غالبًا ما تعمل الخوارزميات الرياضية المكتوبة لهذا الإصدار من Python بشكل أبطأ بكثير من نظيراتها المجمَّعة بسبب غياب تحسين المجمِّع. يعالج NumPy مشكلة البطء جزئيًا من خلال توفير مصفوفات ووظائف ومشغلات متعددة الأبعاد تعمل بكفاءة على المصفوفات؛ يتطلب استخدام هذه إعادة كتابة بعض التعليمات البرمجية، ومعظمها حلقات داخلية ، باستخدام NumPy.
إن استخدام NumPy في Python يمنح وظائف مماثلة لـ MATLAB حيث يتم تفسيرهما معًا، [18] وكلاهما يسمح للمستخدم بكتابة برامج سريعة طالما أن معظم العمليات تعمل على المصفوفات أو المصفوفات بدلاً من القيم القياسية . وبالمقارنة، يتميز MATLAB بعدد كبير من صناديق الأدوات الإضافية، ولا سيما Simulink ، في حين أن NumPy متكامل جوهريًا مع Python، وهي لغة برمجة أكثر حداثة واكتمالاً . علاوة على ذلك، تتوفر حزم Python التكميلية؛ SciPy هي مكتبة تضيف المزيد من الوظائف المشابهة لـ MATLAB و Matplotlib هي حزمة رسم بياني توفر وظائف رسم بياني تشبه MATLAB. على الرغم من أن matlab يمكنه إجراء عمليات مصفوفة متفرقة، إلا أن numpy بمفرده لا يمكنه إجراء مثل هذه العمليات ويتطلب استخدام مكتبة scipy.sparse. داخليًا، يعتمد كل من MATLAB وNumPy على BLAS و LAPACK لإجراء حسابات جبر خطي فعالة .
تستخدم روابط Python لمكتبة OpenCV المستخدمة على نطاق واسع في مجال الرؤية الحاسوبية مصفوفات NumPy لتخزين البيانات والعمل عليها. نظرًا لأن الصور ذات القنوات المتعددة يتم تمثيلها ببساطة كمصفوفات ثلاثية الأبعاد، فإن الفهرسة أو التقطيع أو الإخفاء باستخدام مصفوفات أخرى هي طرق فعالة للغاية للوصول إلى وحدات بكسل معينة من الصورة. تعمل مصفوفة NumPy كبنية بيانات عالمية في OpenCV للصور ونقاط الميزات المستخرجة ونوى المرشحات وغير ذلك الكثير على تبسيط سير عمل البرمجة وتصحيح الأخطاء بشكل كبير . [ بحاجة لمصدر ]
الأمر المهم هو أن العديد من عمليات NumPy تطلق قفل المترجم العالمي ، والذي يسمح بالمعالجة متعددة الخيوط. [19]
يوفر NumPy أيضًا واجهة برمجة تطبيقات C، والتي تسمح لكود Python بالتفاعل مع المكتبات الخارجية المكتوبة بلغات منخفضة المستوى. [20]
بنية بيانات ndarray
الوظيفة الأساسية لـ NumPy هي "ndarray"، وهي بنية بيانات مصفوفة ذات أبعاد n . هذه المصفوفات عبارة عن وجهات نظر متدرجة في الذاكرة. [9] وعلى النقيض من بنية بيانات القائمة المضمنة في Python، فإن هذه المصفوفات من النوع المتجانس: يجب أن تكون جميع عناصر المصفوفة الواحدة من نفس النوع.
يمكن أيضًا عرض مثل هذه المصفوفات في مخازن الذاكرة المخصصة بواسطة ملحقات C / C++ و Python و Fortran لمترجم CPython دون الحاجة إلى نسخ البيانات حولها، مما يوفر درجة من التوافق مع المكتبات الرقمية الموجودة. يتم استغلال هذه الوظيفة بواسطة حزمة SciPy، التي تغلف عددًا من هذه المكتبات (خاصة BLAS وLAPACK). يحتوي NumPy على دعم مدمج لمصفوفات ndarray المخصصة للذاكرة . [9]
القيود
إن إدراج أو إضافة إدخالات إلى مصفوفة ليس بالأمر السهل كما هو الحال مع قوائم بايثون. إن np.pad(...)الروتين لتوسيع المصفوفات ينشئ في الواقع مصفوفات جديدة بالشكل المطلوب وقيم الحشو، وينسخ المصفوفة المعطاة في المصفوفة الجديدة ويعيدها. np.concatenate([a1,a2])لا تربط عملية NumPy المصفوفتين في الواقع ولكنها تعيد مصفوفة جديدة، مليئة بالإدخالات من المصفوفتين المعطاتين بالترتيب. إن إعادة تشكيل أبعاد المصفوفة باستخدام np.reshape(...)ممكنة فقط طالما أن عدد العناصر في المصفوفة لا يتغير. تنشأ هذه الظروف من حقيقة أن مصفوفات NumPy يجب أن تكون وجهات نظر على مخازن ذاكرة متجاورة .
عادةً ما تعمل الخوارزميات التي لا يمكن التعبير عنها كعملية متجهة ببطء لأنها يجب أن تُنفَّذ في "Python النقي"، بينما قد تزيد المتجهات من تعقيد ذاكرة بعض العمليات من ثابت إلى خطي، لأنه يجب إنشاء مصفوفات مؤقتة بحجم المدخلات. تم تنفيذ التجميع وقت التشغيل للكود الرقمي من قبل العديد من المجموعات لتجنب هذه المشكلات؛ تتضمن الحلول مفتوحة المصدر التي تتفاعل مع NumPy numexpr [21] و Numba . [22] Cython وPythran بدائل تجميع ثابتة لهذه.
تتطلب العديد من تطبيقات الحوسبة العلمية الحديثة واسعة النطاق متطلبات تتجاوز قدرات مصفوفات NumPy. على سبيل المثال، عادةً ما يتم تحميل مصفوفات NumPy في ذاكرة الكمبيوتر ، والتي قد لا تكون لديها سعة كافية لتحليل مجموعات البيانات الكبيرة. علاوة على ذلك، يتم تنفيذ عمليات NumPy على وحدة معالجة مركزية واحدة . ومع ذلك، يمكن تسريع العديد من عمليات الجبر الخطي عن طريق تنفيذها على مجموعات من وحدات المعالجة المركزية أو الأجهزة المتخصصة، مثل وحدات معالجة الرسومات ووحدات معالجة الرسومات ، والتي تعتمد عليها العديد من تطبيقات التعلم العميق . ونتيجة لذلك، نشأت العديد من تطبيقات المصفوفات البديلة في النظام البيئي العلمي لبايثون على مدار السنوات الأخيرة، مثل Dask للمصفوفات الموزعة و TensorFlow أو JAX للعمليات الحسابية على وحدات معالجة الرسومات. ونظرًا لشعبيتها، غالبًا ما تنفذ هذه التطبيقات مجموعة فرعية من واجهة برمجة تطبيقات NumPy أو تحاكيها، بحيث يمكن للمستخدمين تغيير تطبيق المصفوفة الخاص بهم مع الحد الأدنى من التغييرات المطلوبة في الكود الخاص بهم. [3] أظهرت مكتبة تسمى CuPy ، [23] والتي تم تسريعها بواسطة إطار عمل CUDA الخاص بشركة Nvidia ، إمكانية تحقيق حوسبة أسرع، حيث تعد بمثابة " بديل مباشر " لـ NumPy. [24]
أمثلة
استيراد numpy كـ np
من numpy.random استيراد rand
من numpy.linalg استيراد solve , inv
a = np . array ([[ 1 , 2 , 3 , 4 ],[ 3 , 4 , 6 , 7 ],[ 5 , 9 , 0 , 5 ]])
a . transpose ()
العمليات الأساسية
>>> a = np . array ([ 1 , 2 , 3 , 6 ])
>>> b = np . linspace ( 0 , 2 , 4 ) # إنشاء مصفوفة بأربع نقاط متباعدة بشكل متساوٍ تبدأ من 0 وتنتهي بـ 2.
>>> c = a - b
>>> c
array ([ 1. , 1.33333333 , 1.66666667 , 4. ])
>>> a ** 2
array ([ 1 , 4 , 9 , 36 ])
وظائف عالمية
>>> a = np . linspace ( - np . pi , np . pi , 100 )
>>> b = np . sin ( a )
>>> c = np . cos ( a )
>>>
>>> # يمكن للوظائف أن تأخذ كلًا من الأرقام والمصفوفات كمعلمات.
>>> np . sin ( 1 )
0.8414709848078965
>>> np . sin ( np . array ([ 1 , 2 , 3 ]))
array ([ 0.84147098 , 0.90929743 , 0.14112001 ])
الجبر الخطي
>>> من numpy.random استيراد rand
>>> من numpy.linalg استيراد solve ، inv
>>> a = np . array ([[ 1 , 2 , 3 ], [ 3 , 4 , 6.7 ], [ 5 , 9.0 , 5 ]])
>>> a . نقل ()
مصفوفة ([[ 1. ، 3. ، 5. ]،
[ 2. ، 4. ، 9. ]،
[ 3. ، 6.7 ، 5. ]])
>>> inv ( a )
مصفوفة ([[ - 2.27683616 ، 0.96045198 ، 0.07909605 ]،
[ 1.04519774 ، - 0.56497175 ، 0.1299435 ]،
[ 0.39548023 ، 0.05649718 ، - 0.11299435 ]])
>>> b = np . array ([ 3 , 2 , 1 ])
>>> حل ( a , b ) # حل المعادلة ax = b
array ([ - 4.83050847 , 2.13559322 , 1.18644068 ])
>>> c = rand ( 3 , 3 ) * 20 # إنشاء مصفوفة عشوائية 3x3 من القيم ضمن [0,1] مقاسة بـ 20
>>> c
array ([[ 3.98732789 , 2.47702609 , 4.71167924 ],
[ 9.24410671 , 5.5240412 , 10.6468792 ],
[ 10.38136661 , 8.44968437 , 15.17639591 ]])
>>> np . dot ( a , c ) # مصفوفة ضرب المصفوفة
([[ 53.61964114 , 38.8741616 , 71.53462537 ],
[ 118.4935668 , 86.14012835 , 158.40440712 ],
[ 155.04043289 , 104.3499231 , 195.26228855 ]])
>>> a @ c # بدءًا من Python 3.5 و NumPy 1.10
array ([[ 53.61964114 , 38.8741616 , 71.53462537 ],
[ 118.4935668 , 86.14012835 , 158.40440712 ],
[ 155.04043289 , 104.3499231 , 195.26228855 ]])
المصفوفات متعددة الأبعاد
>>> M = np . أصفار ( الشكل = ( 2 ، 3 ، 5 ، 7 ، 11 ))
>>> T = np . نقل ( M ، ( 4 ، 2 ، 1 ، 3 ، 0 )
) >>> T. الشكل ( 11 ، 5 ، 3 ، 7 ، 2 )
الدمج مع OpenCV
>>> استيراد numpy كـ np
>>> استيراد cv2
>>> r = np.reshape ( np.arange ( 256 * 256 ) % 256 ،( 256 ، 256 )) # مصفوفة بكسل 256 × 256 بتدرج أفقي من 0 إلى 255 لقناة اللون الأحمر >>> g = np.zeros_like(r) # مصفوفة بنفس الحجم والنوع مثل r ولكنها مملوءة بالصفر لقناة اللون الأخضر >>> b = r.T # سيعطي r المنقول تدرجًا رأسيًا لقناة اللون الأزرق >>> cv2 . imwrite ( 'gradients.png' , np . dstack ([ b , g , r ])) # يتم تفسير صور OpenCV على أنها BGR، وسيتم كتابة المصفوفة المكدسة بالعمق إلى ملف PNG RGB مكون من 8 بت يسمى 'gradients.png' صحيح
البحث عن أقرب جار
خوارزمية بايثون التكرارية وإصدار NumPy المتجه.
>>> # # # بايثون تكراري خالص # # #
>>> points = [[ 9 , 2 , 8 ],[ 4 , 7 , 2 ],[ 3 , 4 , 4 ],[ 5 , 6 , 9 ],[ 5 , 0 , 7 ],[ 8 , 2 , 7 ],[ 0 , 3 , 2 ],[ 7 , 3 , 0 ],[ 6 , 1 , 1 ],[ 2 , 9 , 6 ]]
>>> qPoint = [ 4 , 5 , 3 ]
>>> minIdx = - 1
>>> minDist = - 1
>>> بالنسبة إلى idx ، النقطة في enumerate ( points ): # تكرار على جميع النقاط
... dist = sum ([( dp - dq ) ** 2 بالنسبة إلى dp ، dq في zip ( point ، qPoint )]) ** 0.5 # احسب المسافة الإقليدية لكل نقطة إلى q
... if dist < minDist أو minDist < 0 : # إذا لزم الأمر، قم بتحديث الحد الأدنى للمسافة ومؤشر النقطة المقابلة
... minDist = dist
... minIdx = idx
>>> print ( f 'أقرب نقطة إلى q: { points [ minIdx ] } ' )
أقرب نقطة إلى q : [ 3 , 4 , 4 ]
>>> # # # متجه NumPy المكافئ # # #
>>> استيراد numpy كـ np
>>> points = np . array ([[ 9 , 2 , 8 ],[ 4 , 7 , 2 ],[ 3 , 4 , 4 ],[ 5 , 6 , 9 ],[ 5 , 0 , 7 ],[ 8 , 2 , 7 ],[ 0 , 3 , 2 ],[ 7 , 3 , 0 ],[ 6 , 1 , 1 ],[ 2 , 9 , 6 ]])
>>> qPoint = np . array ([ 4 , 5 , 3 ])
>>> minIdx = np . argmin ( np . linalg . norm ( points - qPoint , axis = 1 )) # احسب جميع المسافات الإقليدية مرة واحدة وأرجع مؤشر أصغر مسافة
>>> print ( f 'أقرب نقطة إلى q: { points [ minIdx ] } ' )
أقرب نقطة إلى q : [ 3 4 4 ]
مجاني
قم بتغليف الكود الأصلي بسرعة للحصول على نصوص برمجية أسرع. [25] [26] [27]
مثال على استدعاء كود أصلي بلغة بايثون فورتران
! f2py -c -m foo *.f90
! قم بتجميع فورتران في وحدة نمطية مسماة بلغة بايثون باستخدام عبارات Intent
! برامج فرعية في فورتران ليست دوال فقط - أسهل من JNI مع غلاف C
! يتطلب gfortran وجعل
البرنامج الفرعي ftest ( a ، b ، n ، c ، d ) ضمنيًا none integer ، intent ( in ) :: a ، b ، n integer ، intent ( out ) :: c ، d integer :: i c = 0 do i = 1 ، n c = a + b + c end do d = ( c * n ) * ( - 1 ) end البرنامج الفرعي ftest
>>> استيراد numpy كـ np
>>> استيراد foo
>>> a = foo . ftest ( 1 , 2 , 3 ) # أو c,d = بدلاً من ac و ad
>>> طباعة ( a )
(9,-27)
>>> مساعدة ( 'foo.ftest' ) # foo.ftest.__doc__
انظر أيضا
- برمجة المصفوفات
- قائمة برامج التحليل العددي
- ثيانو (برنامج)
- ماتبلوتليب
- فورتران
- الترتيب الرئيسي للصفوف والأعمدة
- ف2ج
مراجع
- ^ "الإصدار 2.2.2". 18 يناير 2025. تم الاسترجاع 19 يناير 2025 .
- ^ "NumPy — NumPy". numpy.org . مطورو NumPy.
- ^ أب تشارلز ر هاريس. ك. جارود ميلمان؛ ستيفان ج. فان دير والت؛ وآخرون. (16 سبتمبر 2020). "برمجة المصفوفات باستخدام NumPy" (PDF) . طبيعة . 585 (7825): 357-362 . أرخايف : 2006.10256 . دوى :10.1038/S41586-020-2649-2. ردمك 1476-4687. بمك 7759461 . PMID 32939066. ويكي بيانات Q99413970.
- ^ "مشاريع برعاية NumFOCUS". NumFOCUS . تم الاسترجاع في 2021-10-25 .
- ^ "الفهرسة — دليل NumPy v1.20". numpy.org . تم الاسترجاع في 2021-04-06 .
- ^ abc Millman, K. Jarrod; Aivazis, Michael (2011). "Python for scientist and Engineers". Computing in Science and Engineering . 13 (2): 9– 12. Bibcode :2011CSE....13b...9M. doi :10.1109/MCSE.2011.36. مؤرشف من الأصل في 2019-02-19 . تم الاسترجاع في 2014-07-07 .
- ^ ترافيس أوليفانت (2007). "Python for Scientific Computing" (PDF) . الحوسبة في العلوم والهندسة . مؤرشف من الأصل (PDF) في 2013-10-14 . تم الاسترجاع في 2013-10-12 .
- ^ اي بي سي دي ديفيد آشر؛ بول إف دوبوا؛ كونراد هنسن؛ جيم هوجونين؛ ترافيس أوليفانت (1999). "البيثون العددي" (PDF) .
- ^ اي بي سي دي فان دير والت، ستيفان؛ كولبير، س. كريس؛ فاروقوا، جايل (2011). “مصفوفة NumPy: بنية للحساب العددي الفعال”. الحوسبة في العلوم والهندسة . 13 (2). IEEE: 22. أرخايف : 1102.1523 . بيب كود :2011CSE....13b..22V. دوى :10.1109/MCSE.2011.37. S2CID 16907816.
- ^ "الصفحة الرئيسية لـ Numarray" . تم الاسترجاع في 2006-06-24 .
- ^ Travis E. Oliphant (7 ديسمبر 2006). دليل NumPy . تم الاسترجاع في 2 فبراير 2017 .
- ^ Travis Oliphant ومطورو SciPy الآخرون. "[مناقشة Numpy] حالة Numeric" . تم الاسترجاع في 2 فبراير 2017 .
- ^ "ملفات NumPy Sourceforge" . تم الاسترجاع في 2008-03-24 .
- ^ "History_of_SciPy - SciPy wiki dump". scipy.github.io .
- ^ "ملاحظات إصدار NumPy 1.5.0" . تم الاسترجاع في 2011-04-29 .
- ^ "مدونة حالة PyPy: تمويل NumPy وتحديث الحالة" . تم الاسترجاع في 2011-12-22 .
- ^ "حالة NumPyPy" . تم الاسترجاع في 2023-12-19 .
- ^ مجتمع SciPy. "NumPy لمستخدمي Matlab" . تم الاسترجاع في 2 فبراير 2017 .
- ^ "ملاحظات إصدار numpy".
- ^ McKinney, Wes (2014). "أساسيات NumPy: المصفوفات والحوسبة المتجهة". Python for Data Analysis (الطبعة الأولى، الطبعة الثالثة). O'Reilly. ص. 79. ISBN 978-1-449-31979-3.
- ^ Francesc Alted. "numexpr". GitHub . تم الاسترجاع في 8 مارس 2014 .
- ^ "Numba" . تم الاسترجاع في 8 مارس 2014 .
- ^ Shohei Hido - CuPy: A NumPy-compatible Library for GPU - PyCon 2018، تم أرشفته من الأصل في 2021-12-21 ، تم استرجاعه في 2021-05-11
- ^ Entschev, Peter Andreas (2019-07-23). "تسريعات CuPy لوحدة معالجة رسومية واحدة". Medium . تم الاسترجاع في 2021-05-11 .
- ^ "وثائق F2PY من NumPy". NumPy . تم الاسترجاع في 18 أبريل 2022 .
- ^ Worthey, Guy (3 يناير 2022). "مواجهة بين بايثون وفورتران". Guy Worthey . Guy Worthey . تم الاسترجاع في 18 أبريل 2022 .
- ^ شيل، سكوت. "كتابة روتينات فورتران سريعة لبايثون" (PDF) . قسم الهندسة بجامعة كاليفورنيا سانتا باربرا . جامعة كاليفورنيا، سانتا باربرا . تم الاسترجاع في 18 أبريل 2022 .
قراءة إضافية
- ماكينلي، ويس (2022). بايثون لتحليل البيانات (الطبعة الثالثة). أوريلي. رقم ISBN 978-1098104030.
- بريسيرت، إيلي (2012). Scipy وNumpy: نظرة عامة للمطورين . أوريلي. ISBN 978-1-4493-0546-8.
- فاندربلاس، جيك (2016). "مقدمة إلى NumPy". دليل علوم البيانات بلغة بايثون: الأدوات الأساسية للعمل مع البيانات . أوريلي. ص 33- 96. رقم ISBN 978-1-4919-1205-8.
روابط خارجية
- الموقع الرسمي
- دروس تعليمية حول NumPy
- تاريخ NumPy
