<p>لا يبدو أن numpy.concat يعمل عبر محاور البث (Trac # 1518)</p>

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

_Original تذكرة http://projects.scipy.org/numpy/ticket/1518 بتاريخ 2010-06-22 بواسطة trac user eob ، المخصصة لـ unknown._

عندما أحاول ربط موترتين معًا ، لا تسمح لي عملية التسلسل باستخدام أبعاد البث (باستخدام المحور الجديد) في أحدهما.

00 - Bug Other

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

لقد وجدت حلاً يبدو قوياً بالنسبة لي ... ما عليك سوى استخدام بث_صفحات بالصيغة np.concatenate(np.broadcast_arrays(*arrays), axis=...) . على سبيل المثال: np.concatenate(np.broadcast_arrays(0, [1, 2], [[3, 4], [5, 6]]), axis=1)array([[0, 0, 1, 2, 3, 4], [0, 0, 1, 2, 5, 6]])

ال 11 كومينتر

_trac user eob كتب في 22-06-2010_

ملاحظة: الحل الذي نستخدمه هو تجانب numpy.array الذي أردنا استخدام newaxis عليه ، والذي يعمل ولكن على حساب الذاكرة.

_ @ pv كتب بتاريخ 2010-06-24_

هل يمكنك كتابة جزء مستقل من كود مثال يوضح ما تحاول القيام به ، وما الذي ترغب في حدوثه ، وما يحدث بالفعل.

من وصفك ، ليس من الواضح تمامًا بالنسبة لي كيف تريد عمل الأشياء.

_ @ pv كتب بتاريخ 2010-06-24_

إذا كنت تقصد هذا ،

>>> x = np.array([1,2,3,4])
>>> y = np.array([[1,2],[3,4],[5,6],[7,8]])
>>> np.concatenate((y, np.tile(x, (4,1))), axis=1)
array([[1, 2, 1, 2, 3, 4],
       [3, 4, 1, 2, 3, 4],
       [5, 6, 1, 2, 3, 4],
       [7, 8, 1, 2, 3, 4]])

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

def broadcast_view(x, ref):
    """Broadcast unit dimensions in `x` to match those in `ref` without copies"""
    strides = [0 if x.shape[j] == 1 else x.strides[j] for j in range(x.ndim)]
    shape = [ref.shape[j] if x.shape[j] == 1 else x.shape[j] for j in range(x.ndim)]
    from numpy.lib.stride_tricks import as_strided
    return as_strided(x, shape=shape, strides=strides)

>>> x = np.array([1,2,3,4])
>>> y = np.array([[1,2],[3,4],[5,6],[7,8]])
>>> np.concatenate((y, broadcast_view(x[None,:], y)), axis=1)
array([[1, 2, 1, 2, 3, 4],
       [3, 4, 1, 2, 3, 4],
       [5, 6, 1, 2, 3, 4],
       [7, 8, 1, 2, 3, 4]])
>>> broadcast_view(x[None,:], y).base.base.base is x
True

لكن نعم ، أعتقد أن np.concatenate يجب أن يقوم بذلك تلقائيًا.

أي أخبار / تقدم بشأن np.concatenate دعم البث؟

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

على أي حال ، إذا كنت ترغب في إثارة تلك المحادثة مرة أخرى ، فسيكون المكان الصحيح هو القائمة البريدية ، وليس هنا.

هل يجب إغلاق هذا باعتباره "لن يتم إصلاحه"؟

متفق عليه. لاحظ أن البث اليدوي أصبح الآن أسهل قليلاً لأننا قمنا بالبث.

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

لقد وجدت حلاً يبدو قوياً بالنسبة لي ... ما عليك سوى استخدام بث_صفحات بالصيغة np.concatenate(np.broadcast_arrays(*arrays), axis=...) . على سبيل المثال: np.concatenate(np.broadcast_arrays(0, [1, 2], [[3, 4], [5, 6]]), axis=1)array([[0, 0, 1, 2, 3, 4], [0, 0, 1, 2, 5, 6]])

davidmashburn أعتقد أن هناك مشكلة في هذا الحل (ومع البث اليدوي بشكل عام كما اقترحه الآخرون في هذا الموضوع). لا أعتقد أنه من المنطقي البث في البعد الذي نتسلسل فيه. بعبارة أخرى ، في حالتك ، أتوقع أن ينتهي بي الأمر بعمود واحد من الأصفار.

إذا وجد شخص آخر هذه المشكلة أيضًا ، أثناء البحث عن حل للبث المتسلسل ، قمت بنشر الحل الخاص بي على https://stackoverflow.com/questions/56357047/concatenate-with-broadcast/61061019#61061019

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