【问题标题】:Can I create a numpy array with one variable dimension from a list of numpy arrays?我可以从 numpy 数组列表中创建一个具有一个可变维度的 numpy 数组吗?
【发布时间】:2019-04-16 20:53:33
【问题描述】:

这是我的问题的一个最小示例,我有一个如下所示的 numpy 数组列表:

a = np.zeros([4,3])
b = np.ones([5,3])
my_list = [a, b]

my_list
[array([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]]), array([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])]

列表中的数组可以在一个(并且只有一个)维度(这里是 4 或 5)中具有可变长度。

我最终想要的是一个尺寸为(2,“可变大小”,3)的numpy数组。输出应如下所示:

array([[[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]],
        [[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]]])

np.vstack() 或 np.concatenate() 不会返回我正在寻找的形状,因为它们正在生成具有 (9, 3) 形状的输出。

【问题讨论】:

  • 以上是不可能的,因为这里result[0]shaperesult[1] 不同。 Numpy 通常使用“矩形”数据。
  • 向我们展示您认为所需答案可行的原因。例如,来自 numpy 文档的内容。
  • 我在问这是否可行,或者我怎样才能达到同等的结果,并不意味着我已经收集到任何证据表明它确实可行,事实上我没有
  • Numpy 目前不支持,我相信也没有计划支持锯齿状数组。

标签: python arrays numpy


【解决方案1】:

你不能有形状为 (2, "Variable-size", 3) 的 numpy 数组,但你可以连接两个形状为 ("Variable-size ", 3)(shape1[0] + shape2[0], 3)。 正如你所写:

我正在寻找,因为他们正在生成具有 (9, 3) 形状的输出

numpy.concatenate()

可以解决您的问题:

np.concatenate((a,b))

输出:

array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

如果您仍想在 numpy 中保持可变的第 3 维,唯一的方法是使用 padding,这里使用 zero padding

import numpy as np

a = np.array([
    [50., 50., 50.],
    [50., 50., 50.],
    [50., 50., 50.],
    [50., 50., 50.],
    [0., 0., 0.] # zero padding 
])

b = np.array([
    [80., 80., 80.],
    [80., 80., 80.],
    [80., 80., 80.],
    [80., 80., 80.],
    [80., 80., 80.]
])

new_matrix = [a, b]

print(new_matrix)

输出:

[array([[50., 50., 50.],
       [50., 50., 50.],
       [50., 50., 50.],
       [50., 50., 50.],
       [ 0.,  0.,  0.]]), array([[80., 80., 80.],
       [80., 80., 80.],
       [80., 80., 80.],
       [80., 80., 80.],
       [80., 80., 80.]])]

此方法可广泛用于一种图像处理解决方案。 通过这个技巧,您也可以利用numpy 中矩阵运算的所有积极属性,但您可以保持数据形状相对灵活。 正如威廉上面提到的,numpy 仅适用于“矩形”数据,并且在大多数情况下,使用可变维矩阵的操作将是模棱两可的。

如果您甚至不想使用任何上述解决方案,则必须选择列表和 numpy 数组组合,即列表中具有任意维度的 numpy 数组。

【讨论】:

  • 对不起,如果我不清楚,但我不是在寻找 2d 输出,将这个可变尺寸保留在 3d 输出中对我来说至关重要
  • @MthClv 没问题,请看我上面的完整答案,希望对您有所帮助。
猜你喜欢
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
相关资源
最近更新 更多