NumPy:将1D数组连接到3D数组

时间:2019-06-27 01:09:44

标签: python numpy

假设我有一个5x10x3数组,我将其解释为5个“子数组”,每个子数组由10行和3列组成。我还有一个单独的一维数组,长度为5,我称之为b。

我正在尝试在每个子数组中插入一个新列,其中插入第ith(i = 0,1,2,3,4)个子数组的列是一个10x1向量,其中每个元素等于b [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 个答案:

答案 0 :(得分:1)

那呢?

# 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)

答案 1 :(得分:0)

一种方法是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])]