_Tiket asli http://projects.scipy.org/numpy/ticket/1518 pada 2010-06-22 oleh trac user eob, ditetapkan ke tidak diketahui._
Saat saya mencoba untuk menggabungkan dua tensor bersama-sama, operasi penggabungan tidak memungkinkan saya untuk menggunakan dimensi siaran (menggunakan sumbu baru) di salah satunya.
_trac user eob menulis pada 2010-06-22_
Catatan: solusi yang kami gunakan adalah dengan menyusun numpy.array tempat kami ingin menggunakan sumbu baru, yang berfungsi tetapi dengan mengorbankan memori.
_ @ pv menulis pada 2010-06-24_
Dapatkah Anda menulis bagian kode contoh mandiri yang menunjukkan apa yang Anda coba lakukan, apa yang Anda inginkan terjadi, dan apa yang sebenarnya terjadi.
Dari uraian Anda, tidak sepenuhnya jelas bagi saya bagaimana Anda ingin segala sesuatunya bekerja.
_ @ pv menulis pada 2010-06-24_
Jika Anda bersungguh-sungguh,
>>> 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]])
Anda dapat melakukannya tanpa salinan:
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
Tapi ya, saya kira np.concatenate
harus melakukan ini secara otomatis.
Ada berita / kemajuan tentang np.concatenate
mendukung penyiaran?
Ada beberapa diskusi tentang ini di daftar di masa lalu, dan kebijaksanaan kolektif menentukan bahwa penyiaran dalam operasi gabungan lebih mungkin untuk menutupi kesalahan yang tidak diinginkan, daripada fungsi yang berguna. Kami mungkin harus menutup ini.
Bagaimanapun, jika Anda ingin memulai percakapan itu lagi, tempat yang tepat adalah milis, bukan di sini.
Haruskah ini ditutup karena "tidak bisa diperbaiki"?
Sepakat. Perhatikan bahwa penyiaran manual sekarang sedikit lebih mudah karena kami memiliki broadcast_to.
Saya hanya butuh sedikit penguatan positif, tutup saja. Jika ada yang memiliki pendapat kuat tentang ini, silakan buka kembali.
Saya menemukan solusi yang tampaknya solid bagi saya ... cukup gunakan broadcast_arrays dalam bentuk np.concatenate(np.broadcast_arrays(*arrays), axis=...)
. Contoh: 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 Saya pikir ada masalah dengan solusi ini (dan dengan penyiaran manual secara umum seperti yang disarankan oleh orang lain di utas ini). Saya rasa tidak masuk akal untuk menyiarkan dalam dimensi saat kita menggabungkan. Dengan kata lain, dalam kasus Anda, saya hanya berharap untuk berakhir dengan satu kolom nol.
Jika orang lain juga menemukan Masalah ini, saat mencari solusi penyiaran secara bersamaan, saya memposting solusi saya di https://stackoverflow.com/questions/56357047/concatenate-with-broadcast/61061019#61061019
Komentar yang paling membantu
Saya menemukan solusi yang tampaknya solid bagi saya ... cukup gunakan broadcast_arrays dalam bentuk
np.concatenate(np.broadcast_arrays(*arrays), axis=...)
. Contoh: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]])