ما هي أبسط طريقة لتوسيع مجموعة numpy في بعدين؟
سؤال
لدي مصفوفة ثنائية الأبعاد تبدو كما يلي:
XX
xx
ما هي الطريقة الأكثر فعالية لإضافة صف وعمود إضافي:
xxy
xxy
yyy
للحصول على نقاط إضافية، أود أيضًا أن أكون قادرًا على حذف الصفوف والأعمدة الفردية، لذلك على سبيل المثال في المصفوفة أدناه، أود أن أكون قادرًا على حذف جميع علامات a مع ترك x فقط - على وجه التحديد أنا محاولة حذف الصف n والعمود n في نفس الوقت - وأريد أن أتمكن من القيام بذلك في أسرع وقت ممكن:
xxaxx
xxaxx
aaaaa
xxaxx
xxaxx
المحلول
وأقصر من حيث خطوط رمز يمكنني أن أفكر من هو بالنسبة للسؤال الأول.
>>> import numpy as np
>>> p = np.array([[1,2],[3,4]])
>>> p = np.append(p, [[5,6]], 0)
>>> p = np.append(p, [[7],[8],[9]],1)
>>> p
array([[1, 2, 7],
[3, 4, 8],
[5, 6, 9]])
ووبالنسبة للسؤال الثاني
p = np.array(range(20))
>>> p.shape = (4,5)
>>> p
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
>>> n = 2
>>> p = np.append(p[:n],p[n+1:],0)
>>> p = np.append(p[...,:n],p[...,n+1:],1)
>>> p
array([[ 0, 1, 3, 4],
[ 5, 6, 8, 9],
[15, 16, 18, 19]])
نصائح أخرى
إجابة بديلة مفيدة للسؤال الأول، باستخدام الأمثلة من tomeedee's الإجابة هي استخدام numpy vstack و column_stack طُرق:
نظرا لمصفوفة ص،
>>> import numpy as np
>>> p = np.array([ [1,2] , [3,4] ])
يمكن إنشاء مصفوفة موسعة عن طريق:
>>> p = np.vstack( [ p , [5 , 6] ] )
>>> p = np.column_stack( [ p , [ 7 , 8 , 9 ] ] )
>>> p
array([[1, 2, 7],
[3, 4, 8],
[5, 6, 9]])
قد تكون هذه الطرق ملائمة عمليًا من np.append() لأنها تسمح بإلحاق المصفوفات أحادية الأبعاد بمصفوفة دون أي تعديل، على عكس السيناريو التالي:
>>> p = np.array([ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] ] )
>>> p = np.append( p , [ 7 , 8 , 9 ] , 1 )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/dist-packages/numpy/lib/function_base.py", line 3234, in append
return concatenate((arr, values), axis=axis)
ValueError: arrays must have same number of dimensions
للإجابة على السؤال الثاني، هناك طريقة رائعة لإزالة الصفوف والأعمدة وهي استخدام فهرسة المصفوفات المنطقية كما يلي:
نظرا لمصفوفة ص،
>>> p = np.arange( 20 ).reshape( ( 4 , 5 ) )
لنفترض أننا نريد إزالة الصف 1 والعمود 2:
>>> r , c = 1 , 2
>>> p = p [ np.arange( p.shape[0] ) != r , : ]
>>> p = p [ : , np.arange( p.shape[1] ) != c ]
>>> p
array([[ 0, 1, 3, 4],
[10, 11, 13, 14],
[15, 16, 18, 19]])
ملاحظة - لمستخدمي Matlab الذين تم إصلاحهم - إذا كنت تريد القيام بذلك في سطر واحد، فأنت بحاجة إلى الفهرسة مرتين:
>>> p = np.arange( 20 ).reshape( ( 4 , 5 ) )
>>> p = p [ np.arange( p.shape[0] ) != r , : ] [ : , np.arange( p.shape[1] ) != c ]
يمكن أيضًا توسيع هذه التقنية لإزالة مجموعات من الصفوف والأعمدة، لذلك إذا أردنا إزالة الصفوف 0 و 2 والأعمدة 1 و 2 و 3 يمكننا استخدام numpy's setdiff1d وظيفة لإنشاء الفهرس المنطقي المطلوب:
>>> p = np.arange( 20 ).reshape( ( 4 , 5 ) )
>>> r = [ 0 , 2 ]
>>> c = [ 1 , 2 , 3 ]
>>> p = p [ np.setdiff1d( np.arange( p.shape[0] ), r ) , : ]
>>> p = p [ : , np.setdiff1d( np.arange( p.shape[1] ) , c ) ]
>>> p
array([[ 5, 9],
[15, 19]])
حل أنيق آخر ل السؤال الأول قد يكون insert
يأمر:
p = np.array([[1,2],[3,4]])
p = np.insert(p, 2, values=0, axis=1) # insert values before column 2
يؤدي إلي:
array([[1, 2, 0],
[3, 4, 0]])
insert
قد يكون أبطأ من append
ولكنه يسمح لك بملء الصف/العمود بأكمله بقيمة واحدة بسهولة.
أما بالنسبة لل السؤال الثاني, delete
لقد تم اقتراحه من قبل:
p = np.delete(p, 2, axis=1)
مما يعيد المصفوفة الأصلية مرة أخرى:
array([[1, 2],
[3, 4]])
وأجد أنه من الاسهل بكثير ان "تمديد" عبر تعيين في مصفوفة أكبر. منها مثلا.
import numpy as np
p = np.array([[1,2], [3,4]])
g = np.array(range(20))
g.shape = (4,5)
g[0:2, 0:2] = p
وهنا هي المصفوفات:
وp
array([[1, 2],
[3, 4]])
وg
:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
ووg
الناتج بعد الاحالة:
array([[ 1, 2, 2, 3, 4],
[ 3, 4, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
والإجابة على السؤال الأول:
استخدم numpy.append.
HTTP: //docs.scipy. غزاله / وثيقة / نمباي / إشارة / الناتج / numpy.append.html # numpy.append
والإجابة على السؤال الثاني:
استخدم numpy.delete
http://docs.scipy.org/doc/ نمباي / إشارة / الناتج / numpy.delete.html
ويمكنك استخدام:
>>> np.concatenate([array1, array2, ...])
ومنها مثلا.
>>> import numpy as np
>>> a = [[1, 2, 3],[10, 20, 30]]
>>> b = [[100,200,300]]
>>> a = np.array(a) # not necessary, but numpy objects prefered to built-in
>>> b = np.array(b) # "^
>>> a
array([[ 1, 2, 3],
[10, 20, 30]])
>>> b
array([[100, 200, 300]])
>>> c = np.concatenate([a,b])
>>> c
array([[ 1, 2, 3],
[ 10, 20, 30],
[100, 200, 300]])
>>> print c
[[ 1 2 3]
[ 10 20 30]
[100 200 300]]
~ - + - ~ - + - ~ - + - ~
في بعض الأحيان، سوف تأتي عبر مشكلة إذا تم تهيئة كائن مجموعة نمباي مع القيم غير مكتملة على العقارات شكله. تم إصلاح هذه المشكلة عن طريق تعيين إلى الخاصية شكل من الصفوف (tuple): (array_length، element_length)
ملحوظة: وهنا، 'array_length "و" element_length: عبارة المعلمات صحيحة، الذي قيم بديلة في ل. A 'الصفوف (tuple)' هو مجرد زوج من الأرقام بين قوسين.
ومنها مثلا.
>>> import numpy as np
>>> a = np.array([[1,2,3],[10,20,30]])
>>> b = np.array([100,200,300]) # initialize b with incorrect dimensions
>>> a.shape
(2, 3)
>>> b.shape
(3,)
>>> c = np.concatenate([a,b])
Traceback (most recent call last):
File "<pyshell#191>", line 1, in <module>
c = np.concatenate([a,b])
ValueError: all the input arrays must have same number of dimensions
>>> b.shape = (1,3)
>>> c = np.concatenate([a,b])
>>> c
array([[ 1, 2, 3],
[ 10, 20, 30],
[100, 200, 300]])
وربما كنت في حاجة الى ذلك.
>>> x = np.array([11,22])
>>> y = np.array([18,7,6])
>>> z = np.array([1,3,5])
>>> np.concatenate((x,y,z))
array([11, 22, 18, 7, 6, 1, 3, 5])