عند محاولة فهرسة مصفوفة ثنائية الأبعاد من الشكل [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,)
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,)
نعم ، 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 أيضًا أنه على الأقل بالنسبة للفهرسة الحالية لمؤشرات منطقية متعددة يجب أن يتم إهمالها (أعتقد أن السماح بحالة الاستخدام المحددة هذه ربما لا يزال محل نزاع - فهو متسق ، ولكن قد لا يكون له حالة استخدام كبيرة ويكون مربكًا جدًا في بأي حال).
التعليق الأكثر فائدة
باستخدام المصفوفات المنطقية ، تفترض الشفرة أنك تحاول فهرسة بُعد واحد أو جميع العناصر في نفس الوقت - مع اختيار للأسف إلى حد ما تخمين بطريقة تسمح بإزالة
True
. أي أنه يحولrow_mask, col_mask
الخاص بك إلى مصفوفة منطقية (2،3) ثم يكتشف أنه لا يمكنه فهرسة المصفوفة (3،3).جزء من المشكلة هو أن المجموعات والقوائم يتم التعامل معها على أنها متكافئة ، وهو أمر نحاول الابتعاد عنه. في النهاية ، ستتعامل مع فهرس المصفوفة المنطقية من خلال التأكد من أن القناع كان عبارة عن قائمة مزدوجة.
في الوقت الحالي ، على الرغم من ذلك ، أخشى أن الحل الوحيد هو القيام بـ
x[row_mask][:, col_mask]
.cc @ eric-wieser ، الذي كان يعمل على إهمال "معاملة المجموعة كقائمة" لعمليات الفهرسة.
ملاحظة أكثر إزعاجًا أجد هذا الاختلاف: