سؤال

لدي مصفوفة ثنائية الأبعاد تبدو كما يلي:

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])
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top