• 0

استبدل جميع عناصر مصفوفة NumPy التي تكون أكبر من 255

لدي مصفوفة 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 تقوم بهذا الأمر؟ وكيف أقوم بهذا الأمر في حالة كان حجم المصفوفة مختلفًا (أي لم تكن المصفوفة ثنائية الأبعاد على سبيل المثال)؟

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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)
# قريبتان من بعضهما لكن الأولى أفضل

 

2 اشخاص أعجبوا بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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

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

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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 ]]

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن