سؤال

وأي شخص يأتي من أي وقت مضى لهذه المشكلة؟ دعونا نقول لديك اثنين من صفائف كما يلي

a = array([1,2,3,4,5,6])
b = array([1,4,5])

هل هناك طريقة لمقارنة ما هي العناصر في الوجود في ب؟ على سبيل المثال،

c = a == b # Wishful example here
print c
array([1,4,5])
# Or even better
array([True, False, False, True, True, False])

وأنا أحاول تجنب الحلقات كما ان الامر سيستغرق الأعمار مع الملايين من العناصر. أيه أفكار؟

وهتاف

هل كانت مفيدة؟

المحلول

في الواقع، لا يوجد حل حتى أبسط من أي من هذه:

import numpy as np

a = array([1,2,3,4,5,6])
b = array([1,4,5])

c = np.in1d(a,b)

ووج الناتجة ثم:

array([ True, False, False,  True,  True, False], dtype=bool)

نصائح أخرى

استخدم np.intersect1d.

#!/usr/bin/env python
import numpy as np
a = np.array([1,2,3,4,5,6])
b = np.array([1,4,5])
c=np.intersect1d(a,b)
print(c)
# [1 4 5]

لاحظ أن np.intersect1d يعطي إجابة خاطئة إذا كان أو ب ديها عناصر nonunique. في ذلك حالة استخدام np.intersect1d_nu.

وهناك np.setdiff1d أيضا، setxor1d، setmember1d، وunion1d. نرى قائمة مثال نمباي مع الوثيقة

وشكرا لردكم kaizer.se. انها ليست تماما ما كنت أبحث عنه، ولكن مع اقتراح من صديق وما قلته خطرت لي ما يلي:

import numpy as np

a = np.array([1,4,5]).astype(np.float32)
b = np.arange(10).astype(np.float32)

# Assigning matching values from a in b as np.nan
b[b.searchsorted(a)] = np.nan

# Now generating Boolean arrays
match = np.isnan(b)
nonmatch = match == False

وانها قليلا من عملية مرهقة، ولكنه يتفوق كتابة الحلقات أو باستخدام نسج مع الحلقات.

وهتاف

ونمباي ديه numpy.setmember1d مجموعة وظيفة () الذي يعمل على صفائف فرزها وuniqued ويعود بالضبط مجموعة المنطقية التي تريدها. إذا صفائف المدخلات لا تتطابق مع المعايير التي سوف تحتاج إلى تحويل إلى تنسيق مجموعة وعكس هذا التحول على النتيجة.

import numpy as np
a = np.array([6,1,2,3,4,5,6])
b = np.array([1,4,5])

# convert to the uniqued form
a_set, a_inv = np.unique1d(a, return_inverse=True)
b_set = np.unique1d(b)
# calculate matching elements
matches = np.setmea_set, b_set)
# invert the transformation
result = matches[a_inv]
print(result)
# [False  True False False  True  True False]

وتحرير: للأسف طريقة setmember1d في نمباي غير فعال حقا. البحث فرز وطريقة تعيين لك المقترحة يعمل بشكل أسرع، ولكن إذا كان يمكنك تعيين مباشرة قد تعيين فضلا مباشرة إلى نتيجة وتجنب الكثير من النسخ غير الضرورية. أيضا ستفشل طريقة إذا ب يحتوي على أي شيء لا في. وفيما يلي بتصحيح هذه الأخطاء:

result = np.zeros(a.shape, dtype=np.bool)
idxs = a.searchsorted(b)
idxs = idxs[np.where(idxs < a.shape[0])] # Filter out out of range values
idxs = idxs[np.where(a[idxs] == b)] # Filter out where there isn't an actual match
result[idxs] = True
print(result)

وبلدي معايير توضح ان هذا في 91us مقابل 6.6ms لنهجكم و109ms لsetmember1d نمباي على 1M عنصر لو 100 عنصر ب.

سوف

وebresset، إجابتك لا تعمل إلا إذا وهو مجموعة فرعية من ب (وأ و ب يتم فرز). وإلا فإن searchsorted سيعود مؤشرات خاطئة. كان علي أن أفعل شيئا من هذا القبيل، والجمع بين ذلك والتعليمات البرمجية:

# Assume a and b are sorted
idxs = numpy.mod(b.searchsorted(a),len(b))
idxs = idxs[b[idxs]==a]
b[idxs] = numpy.nan
match = numpy.isnan(b)

والمثال لديك ينطوي تحديد مثل السلوك، ورعاية المزيد عن الوجود في مجموعة من وجود العنصر المناسب في المكان المناسب. نمباي يفعل ذلك بشكل مختلف مع المصفوفات والمصفوفات الرياضية، فإنه سوف اقول لكم فقط حول العناصر في المكان الصحيح بالضبط. يمكنك إجراء هذا العمل بالنسبة لك؟

>>> import numpy
>>> a = numpy.array([1,2,3])
>>> b = numpy.array([1,3,3])
>>> a == b
array([ True, False,  True], dtype=bool)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top