NumPy: объединение 1D массива в 3D массив - PullRequest
2 голосов
/ 27 июня 2019

Предположим, у меня есть массив 5x10x3, который я интерпретирую как 5 «подмассивов», каждый из которых состоит из 10 строк и 3 столбцов. У меня также есть отдельный массив 1D длиной 5, который я называю б.

Я пытаюсь вставить новый столбец в каждый под-массив, где столбец, вставленный в под-массив ih (i = 0,1,2,3,4), представляет собой вектор 10x1, где каждый элемент равен б [I].

Например:

import numpy as np
np.random.seed(777)
A = np.random.rand(5,10,3)
b = np.array([2,4,6,8,10])

A [0] должно выглядеть так:

A [1] должно выглядеть так:

И аналогично для других «подмассивов». (Примечание b [0] = 2 и b [1] = 4)

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Как насчет этого?

# Make an array B with the same dimensions than A
B = np.tile(b, (1, 10, 1)).transpose(2, 1, 0)  # shape: (5, 10, 1)

# Concatenate both
np.concatenate([A, B], axis=-1)  # shape: (5, 10, 4)
0 голосов
/ 27 июня 2019

Один из методов будет np.pad:

np.pad(A, ((0,0),(0,0),(0,1)), 'constant', constant_values=[[[],[]],[[],[]],[[],b[:, None,None]]])
# array([[[9.36513084e-01, 5.33199169e-01, 1.66763960e-02, 2.00000000e+00],
#         [9.79060284e-02, 2.17614285e-02, 4.72452812e-01, 2.00000000e+00],
 # etc.

Или (больше печатать, но, вероятно, быстрее):

i,j,k = A.shape
res = np.empty((i,j,k+1), np.result_type(A, b))
res[...,:-1] = A
res[...,-1] = b[:, None]

Или dstack после broadcast_to:

np.dstack([A,np.broadcast_to(b[:,None],A.shape[:2])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...