اذهب إلى المحتوى

السؤال

نشر

لدي مصفوفة NumPy ثنائية الأبعاد وأريد استبدال كل القيم الأكبر أو تساوي عتبة محددة T بالقيمة 255.0

import numpy as np
arr = np.array([[1,2,3,4,5,6,7,8,9,0], [11,22,33,44,55,66,77,88,99,110]])

هل يجب أن أقوم بالمرور على كل عنصر في المصفوفة وأقوم بإستبداله يدويًا أم أن هناك دالة جاهزة أو طريقة أسرع في مكتبة Numpy تقوم بهذا الأمر؟ وكيف أقوم بهذا الأمر في حالة كان حجم المصفوفة مختلفًا (أي لم تكن المصفوفة ثنائية الأبعاد على سبيل المثال)؟

Recommended Posts

  • 0
نشر

يمكنك استخدام الدالة  np.place حيث يمكنك التحقق من الشرط أولاً ثم استبدال العناصر التي تريدها

لاحظ المثال التالي

import numpy as np

# إنشاء مصفوفة 2*3 بالقيم من 0...5
arr = np.arange(6).reshape(2, 3)

# استبدال الرقم 2 ب 3
np.place(arr, arr == 2, 3)

كما يمكنك استخدام ال fancy indexing كالتالي

arr[arr > 255] = x

سيتم استبدال العناصر الأكبر من 255 بالقيمة x

تعتبر الطريقة الثانية هي الأسرع

  • 0
نشر

هناك أكثر من طريقة لتحقيق هذا منها:

  • الطريقة التقليدية: عن طريق تفحص كل العناصر وتبديل العناصر التي تحقق الشرط المطلوب كالتالي:
shape = arr.shape
result = np.zeros(shape)
for x in range(0, shape[0]):
    for y in range(0, shape[1]):
        if arr[x, y] >= T:
            result[x, y] = 255
  • الطريقة السهلة: عن طريق استخدام  ال fancy indexing كالتالي، الكود التالي يوضح كيفية استخدامها جميع العناصر الاكبر من 0.5 بقيمة أخرى وهي 0.5
import numpy as np
x = np.array([[ 0.42436315, 0.48558583, 0.32924763], [ 0.7439979,0.58220701,0.38213418], [ 0.5097581,0.34528799,0.1563123 ]])
print("Original array:")
print(x)
print("Replace all elements of the said array with .5 which are greater than .5")
x[x > .5] = .5
print(x)

ويكون الخرج كالتالي:

Original array:                                                        
[[ 0.42436315  0.48558583  0.32924763]                                 
 [ 0.7439979   0.58220701  0.38213418]                                 
 [ 0.5097581   0.34528799  0.1563123 ]]                                
Replace all elements of the said array with .5 which are greater than .
5                                                                      
[[ 0.42436315  0.48558583  0.32924763]                                 
 [ 0.5         0.5         0.38213418]                                 
 [ 0.5         0.34528799  0.1563123 ]]

 

  • 2
نشر

يمكنك القيام بذلك بشكل يدوي:

import numpy as np
A = np.random.randint(low=0,high=255, size=(2, 4)).astype(float)
A
"""
array([[166., 246.,  37., 195.],
       [ 63.,  33., 189., 200.]])
"""
th=127
A[A > th] = 255.0
A
"""
array([[255., 255.,  37., 255.],
       [ 63.,  33., 255., 255.]])
"""

كما ويمكنك استخدام التابع np.putmask حيث نمرر له المصفوفة والعتبة والقيمة المراد الاستبدال بها:

A = np.random.randint(low=0,high=255, size=(2, 4)).astype(float)
"""
array([[ 62.,  23., 218., 205.],
       [197., 254., 149.,  32.]])
"""
# تحديد العتبة
T=127
np.putmask(A, A>=T, 255.0)
"""
array([[ 62.,  23., 255., 255.],
       [255., 255., 255.,  32.]])
"""

أو من خلال np.place حيث نمرر له المصفوفة، ثم العتبة كما في المثال، ثم القيمة المراد التحويل لها :

A=np.array([[ 62.,  23., 218., 205.],
       [197., 254., 149.,  32.]])
np.place(A, A >=127, 255)
"""
array([[ 62.,  23., 255., 255.],
       [255., 255., 255.,  32.]])
"""

أو من خلال np.where:

A=np.array([[ 62.,  23., 218., 205.],
       [197., 254., 149.,  32.]])
np.where(A > 127, 255,A)
"""
array([[ 62.,  23., 255., 255.],
       [255., 255., 255.,  32.]])
"""

كمقارنة:

%timeit np.place(A, A >=127, 255)
%timeit np.putmask(A, A>127, 255)
%timeit np.where(A > 127, 255,A)
3.44 µs ± 197 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
3.03 µs ± 162 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
4.84 µs ± 1.15 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)
# قريبتان من بعضهما لكن الأولى أفضل

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...