_Original تذكرة http://projects.scipy.org/numpy/ticket/1518 بتاريخ 2010-06-22 بواسطة trac user eob ، المخصصة لـ unknown._
عندما أحاول ربط موترتين معًا ، لا تسمح لي عملية التسلسل باستخدام أبعاد البث (باستخدام المحور الجديد) في أحدهما.
_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
التعليق الأكثر فائدة
لقد وجدت حلاً يبدو قوياً بالنسبة لي ... ما عليك سوى استخدام بث_صفحات بالصيغة
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]])