将2D阵列扩展为具有特定长度的3D阵列

时间:2020-03-11 07:34:15

标签: python numpy dimensions

我有一个100x100的numpy数组,我想为其添加第三个维度,该维度的长度为3,具有[1,0,1]。 如果可能,我正在尝试不使用for循环。 尝试了诸如np.newaxis之类的各种方法,但是它仅扩展了长度为1的维,然后无法使用长度为3的数组进行填充。

谢谢你

2 个答案:

答案 0 :(得分:1)

根据您的需求,您可以选择以下几种方式:

import numpy as np
arr = np.random.random((100, 100))
some_numbers = [1, 0, 1]

# A
new_arr = np.empty(arr.shape + (3,))
new_arr[..., :] = some_numbers
# array([[[1., 0., 1.],
#         [1., 0., 1.],
#         [1., 0., 1.], 
#         ...,

# A2
new_arr = np.empty(arr.shape + (len(some_numbers) + 1,))
new_arr[..., 0] = arr[..., np.newaxis]
new_arr[..., 1:] = some_numbers
# array([[[0.2853, 1., 0., 1.],
#         [0.7324, 1., 0., 1.],
#         [0.0706, 1., 0., 1.],
#         ...,

# B
new_arr = np.empty(arr.shape + (3,))
new_arr[..., :] = arr[..., np.newaxis]

# C
new_arr = np.repeat(arr[..., np.newaxis], 3, axis=-1)
# array([[[0.2853, 0.2853, 0.2853],
#         [0.7324, 0.7324, 0.7324],
#         [0.0706, 0.0706, 0.0706],
#         ...,
  • case A中,您将用[1, 0, 1]覆盖arr的所有元素。
  • case A2中,将原始数组保留在new_arr[:, :, 0]处,并用new_arr[:, :, 1:]填充其余平面some_numbers
  • case Bcase C中,您沿着新的第三个维度重复100x100数组3次。

答案 1 :(得分:0)

据我了解,您想生成一个3-D数组:

  • 第一个充满一层的“层”
  • 第二个“层”用零填充,
  • 第三“层”再次充满了一层,
  • 所有尺寸为100 * 100的“图层”。

为了便于阅读,我更改了您的假设:

  • 充满“ 2 ”的第三个“层”,
  • 尺寸为5 * 5的所有“层”。

第1步:创建每个2-D数组(目标数组中的图层):

arr1 = np.ones((5,5), dtype=np.int)
arr2 = np.zeros((5,5), dtype=np.int)
arr3 = np.full((5,5), 2)

第2步:创建目标数组:

res = np.stack((arr1, arr2, arr3), axis=2)

打印 res.shape 时,您将得到:

(5, 5, 3)

(5行,5列,3层)

要分别查看每个“层”,请运行res[:, :, n],其中 n 0 1 2 。例如。对于 n == 2 (最后一层),我得到了:

array([[2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2]])