Проблема среза в C ++ возникает из семантики значений ее объектов, которая оставалась в основном из-за совместимости с C-структурами. Вам нужно использовать явный синтаксис ссылок или указателей для достижения «нормального» поведения объекта, обнаруженного на большинстве других языков, которые выполняют объекты, т. Е. Объекты всегда передаются по ссылке.
Короткими ответами являются то, что вы нарезаете объект путем присвоения производного объекта базовому объекту значением , то есть оставшийся объект является лишь частью производного объекта. Чтобы сохранить семантику стоимости, нарезка является разумным поведением и имеет относительно редкое применение, которое не существует на большинстве других языков. Некоторые люди считают это особенностью C ++, в то время как многие считают ее одной из особенностей / недостатков C ++.
Вы можете использовать dstack :
>>> np.dstack((a,b))
array([[[0, 0],
[1, 1],
[2, 2],
[3, 3]],
[[4, 4],
[5, 5],
[6, 6],
[7, 7]]])
Если у вас есть кортежи:
>>> np.array(zip(a.ravel(),b.ravel()), dtype=('i4,i4')).reshape(a.shape)
array([[(0, 0), (1, 1), (2, 2), (3, 3)],
[(4, 4), (5, 5), (6, 6), (7, 7)]],
dtype=[('f0', '<i4'), ('f1', '<i4')])
Для Python 3+ вам нужно для расширения объекта итератора zip
. Обратите внимание, что это ужасно неэффективно:
>>> np.array(list(zip(a.ravel(),b.ravel())), dtype=('i4,i4')).reshape(a.shape)
array([[(0, 0), (1, 1), (2, 2), (3, 3)],
[(4, 4), (5, 5), (6, 6), (7, 7)]],
dtype=[('f0', '<i4'), ('f1', '<i4')])
dstack
отлично работает для меня! – LWZ 31 July 2013 в 07:13TypeError: a bytes-like object is required, not 'zip'
- почему? – Make42 17 July 2017 в 13:59zip
возвращает итератор. См. Отредактированный ответ. – Daniel 18 July 2017 в 14:44.ravel()
. – equaeghe 28 August 2017 в 10:07