我可以从numpy数组列表中创建一个具有一个变量维的numpy数组吗?

时间:2018-11-13 23:14:48

标签: python arrays numpy

这是我的问题的一个最小例子,我有一个如下的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,“ Variable-size”,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)形状。

1 个答案:

答案 0 :(得分:0)

您不能使用形状为(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中保持可变的三维尺寸,这是使用 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中矩阵运算的所有积极特性,但可以使数据形状相对灵活。 正如上面提到的Willem一样,numpy仅适用于“矩形”数据,而在大多数情况下,使用可变维矩阵的运算将变得模棱两可。

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