Что такое эффективный способ преобразовать следующие Numpy массивы:Как изменить структуру массива?
a1 = \
[[ 1.1 -1.1 0.1]
[ 2.1 -2.1 0.1]
[ 3.1 -3.1 0.1]
[ 4.1 -4.1 0.1]
[ 5.1 -5.1 0.1]]
и
a2 = \
[[ 1.2 -1.2 0.2]
[ 2.2 -2.2 0.2]
[ 3.2 -3.2 0.2]
[ 4.2 -4.2 0.2]
[ 5.2 -5.2 0.2]]
в A:
[[[ 1.1 1.2]
[ 2.1 2.2]
[ 3.1 3.2]
[ 4.1 4.2]
[ 5.1 5.2]]
[[-1.1 -1.2]
[-2.1 -2.2]
[-3.1 -3.2]
[-4.1 -4.2]
[-5.1 -5.2]]
[[ 0.1 0.2]
[ 0.1 0.2]
[ 0.1 0.2]
[ 0.1 0.2]
[ 0.1 0.2]]]
Есть ли способ сделать это без копирования данных (например, изменение значений в A также изменит соответствующие значения в a1 или a2)?
UPD. Вот один из принятых ответов и пути назад я использовал, - как копирование, наконец, обязательным:
import numpy as np
a1 = [[ 1.1, -1.1, 0.1],
[ 2.1, -2.1, 0.1],
[ 3.1, -3.1, 0.1],
[ 4.1, -4.1, 0.1],
[ 5.1, -5.1, 0.1]]
a1 = np.array(a1)
a2 = [[ 1.2, -1.2, 0.2],
[ 2.2, -2.2, 0.2],
[ 3.2, -3.2, 0.2],
[ 4.2, -4.2, 0.2],
[ 5.2, -5.2, 0.2]]
a2 = np.array(a2)
a_expected = [[[ 1.1, 1.2],
[ 2.1, 2.2],
[ 3.1, 3.2],
[ 4.1, 4.2],
[ 5.1, 5.2]],
[[-1.1, -1.2],
[-2.1, -2.2],
[-3.1, -3.2],
[-4.1, -4.2],
[-5.1, -5.2]],
[[ 0.1, 0.2],
[ 0.1, 0.2],
[ 0.1, 0.2],
[ 0.1, 0.2],
[ 0.1, 0.2]]]
npar = 2
a = np.concatenate((a1[...,None].transpose(1,0,2), a2[...,None].transpose(1,0,2)), npar)
assert np.all(a == a_expected)
new_a1 = a.transpose(2, 1, 0)[0]
new_a2 = a.transpose(2, 1, 0)[1]
assert np.all(new_a1 == a1)
assert np.all(new_a2 == a2)
В общем случае, заданные 'a1' и' a2', невозможно создать 'A' без копирования. Каждый массив NumPy содержит указатель на начало непрерывного блока памяти. Затем он использует strides, shape и dtype для определения значений в массиве. Если базовые данные в 'a1' и' a2' не являются частью одного непрерывного блока памяти, нет никакого способа присоединиться к ним - без копирования - в один новый массив NumPy, 'A', поскольку новый массив может имеют только * один указатель *, один шаг, одну форму и один тип dtype. – unutbu