Numpy: أخطاء البث مع الأقنعة البولينية متعددة الأبعاد

تم إنشاؤها على ٣ أبريل ٢٠١٩  ·  3تعليقات  ·  مصدر: numpy/numpy

عند محاولة فهرسة مصفوفة ثنائية الأبعاد من الشكل [N ، M] باستخدام أقنعة منطقية أحادية الأبعاد ، الأشكال N و M ، تؤدي مجموعات معينة من True و False إلى خطأ في البث (خاصة عندما يكون أحدها خاطئًا). لست متأكدًا مما إذا كان هذا السلوك متوقعًا ولكنه يبدو مفاجئًا للغاية وغير مرغوب فيه.

في المثال أدناه ، أخطاء x[[False, True, True], [True, True, True]] ، بينما x[[False, True, True], True] و x[[False, True, True]] لها السلوك المتوقع.

مثال على إعادة إنتاج الكود:

import numpy as np
from itertools import product

x = np.zeros((3,3))
mask_1d = [*product([True, False], repeat=3)]

for row_mask, col_mask in product(mask_1d, mask_1d):
    try:
        x[row_mask, col_mask]
    except IndexError as e:
        print(row_mask, col_mask)
        print(e)

رسالة خطأ:

     (True, True, True) (True, True, False)
shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (2,) 
(True, True, True) (True, False, True)
shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (2,) 
(True, True, True) (False, True, True)
shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (2,) 
(True, True, True) (False, False, False)
shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (0,) 
(True, True, False) (True, True, True)
shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (3,) 
(True, True, False) (False, False, False)
shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (0,) 
(True, False, True) (True, True, True)
shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (3,) 
(True, False, True) (False, False, False)
shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (0,) 
(False, True, True) (True, True, True)
shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (3,) 
(False, True, True) (False, False, False)
shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (0,) 
(False, False, False) (True, True, True)
shape mismatch: indexing arrays could not be broadcast together with shapes (0,) (3,) 
(False, False, False) (True, True, False)
shape mismatch: indexing arrays could not be broadcast together with shapes (0,) (2,) 
(False, False, False) (True, False, True)
shape mismatch: indexing arrays could not be broadcast together with shapes (0,) (2,) 
(False, False, False) (False, True, True)
shape mismatch: indexing arrays could not be broadcast together with shapes (0,) (2,)

معلومات إصدار Numpy / Python:

1.16.2 3.6.8 |Anaconda, Inc.| (default, Dec 30 2018, 01:22:34) 
[GCC 7.3.0]

التعليق الأكثر فائدة

باستخدام المصفوفات المنطقية ، تفترض الشفرة أنك تحاول فهرسة بُعد واحد أو جميع العناصر في نفس الوقت - مع اختيار للأسف إلى حد ما تخمين بطريقة تسمح بإزالة True . أي أنه يحول row_mask, col_mask الخاص بك إلى مصفوفة منطقية (2،3) ثم يكتشف أنه لا يمكنه فهرسة المصفوفة (3،3).

جزء من المشكلة هو أن المجموعات والقوائم يتم التعامل معها على أنها متكافئة ، وهو أمر نحاول الابتعاد عنه. في النهاية ، ستتعامل مع فهرس المصفوفة المنطقية من خلال التأكد من أن القناع كان عبارة عن قائمة مزدوجة.

في الوقت الحالي ، على الرغم من ذلك ، أخشى أن الحل الوحيد هو القيام بـ x[row_mask][:, col_mask] .

cc @ eric-wieser ، الذي كان يعمل على إهمال "معاملة المجموعة كقائمة" لعمليات الفهرسة.

ملاحظة أكثر إزعاجًا أجد هذا الاختلاف:

x = np.arange(9).reshape(3, 3)
# x[[False, True, True], True]
# array([[3, 4, 5],
#        [6, 7, 8]])
x[[False, True, True], False]
# IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (0,) 

ال 3 كومينتر

باستخدام المصفوفات المنطقية ، تفترض الشفرة أنك تحاول فهرسة بُعد واحد أو جميع العناصر في نفس الوقت - مع اختيار للأسف إلى حد ما تخمين بطريقة تسمح بإزالة True . أي أنه يحول row_mask, col_mask الخاص بك إلى مصفوفة منطقية (2،3) ثم يكتشف أنه لا يمكنه فهرسة المصفوفة (3،3).

جزء من المشكلة هو أن المجموعات والقوائم يتم التعامل معها على أنها متكافئة ، وهو أمر نحاول الابتعاد عنه. في النهاية ، ستتعامل مع فهرس المصفوفة المنطقية من خلال التأكد من أن القناع كان عبارة عن قائمة مزدوجة.

في الوقت الحالي ، على الرغم من ذلك ، أخشى أن الحل الوحيد هو القيام بـ x[row_mask][:, col_mask] .

cc @ eric-wieser ، الذي كان يعمل على إهمال "معاملة المجموعة كقائمة" لعمليات الفهرسة.

ملاحظة أكثر إزعاجًا أجد هذا الاختلاف:

x = np.arange(9).reshape(3, 3)
# x[[False, True, True], True]
# array([[3, 4, 5],
#        [6, 7, 8]])
x[[False, True, True], False]
# IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (0,) 

نعم ، x[row_mask][:, col_mask] هو ما أفعله في النهاية. شكرًا على الشرح ، أنا سعيد أنه شيء يتم النظر فيه.

أعتقد أن arr[np.ix_(index)] هو ما تريد / تتوقعه هنا ، أو بكلمات أخرى على منطق الفهرسة الخارجي كما هو الحال في NEP 21: https://github.com/numpy/numpy/blob/master/doc/neps /nep-0021-advanced-indexing.rst

ربما سيتم التقاط ذلك في وقت ما. تقول NEP أيضًا أنه على الأقل بالنسبة للفهرسة الحالية لمؤشرات منطقية متعددة يجب أن يتم إهمالها (أعتقد أن السماح بحالة الاستخدام المحددة هذه ربما لا يزال محل نزاع - فهو متسق ، ولكن قد لا يكون له حالة استخدام كبيرة ويكون مربكًا جدًا في بأي حال).

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات