这是我的问题的一个最小例子,我有一个如下的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)形状。
答案 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数组。