【问题标题】:Expand a 2D array into a 3D array with specific length将 2D 数组扩展为具有特定长度的 3D 数组
【发布时间】:2020-03-11 07:34:15
【问题描述】:

我有一个 100x100 的 numpy 数组,我想为其添加一个长度为 3 且具有 [1,0,1] 的第三维。 如果可能的话,我正在尝试在没有 for 循环的情况下执行此操作。 尝试了各种类似 np.newaxis 的方法,但它只扩展长度为 1 的维度,然后无法填充长度为 3 的数组。

谢谢你

【问题讨论】:

  • 什么是 [1,0,1]?
  • 只有 3 个数字的数组。没关系。
  • 这很重要,因为你没有解释他们的目的。您想覆盖原始数组数据并拥有一个平面、一个平面零和另一个平面吗?或者您要添加三个 更多 平面?
  • 我想再添加三架飞机。我更了解自己:)

标签: python numpy dimensions


【解决方案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],并分别用some_numbers 填充剩余的平面new_arr[:, :, 1:]
  • case Bcase C 中,沿着新的第三维重复 100x100 数组 3 次。

【讨论】:

  • 谢谢,但这不是我所需要的。既不是 A 也不是 B 和 C。我不想替换所有东西。或者在 3d 中重复 2d。我希望第三个维度是其他三个数字的集合
  • 什么数字?只有三个数字?还是 3 个不同的 (100 x 100) 数组?您能否清楚地说明您想要实现的目标,最好举个例子。
  • 好的。很明显我不清楚。我想将二维数组扩展为 3 个平面,然后用一些数字填充每个平面。所以我认为@valdi_bo 几乎是我所需要的
  • 好的,但我还是有点困惑。您描述的情况是不是 case A[some_num1, some_num2, some_num3] 而不是 [1, 0, 1]
  • 我加了case A2,这是你想要达到的效果吗?
【解决方案2】:

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

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

为了可读性,我改变了你的假设:

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

第 1 步:创建每个二维数组(目标数组中的层):

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

第二步:创建目标数组:

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

当你打印res.shape时,你会得到:

(5, 5, 3)

(5行5列3层)

要单独查看每个“层”,请运行 res[:, :, n] 其中 n012。例如。对于 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]])

【讨论】:

    猜你喜欢
    • 2016-03-25
    • 1970-01-01
    • 2019-08-20
    • 2018-07-05
    • 2023-01-25
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多