将具有异构维度的 3D numpy 数组重塑为 2D numpy 数组
Reshape 3D numpy array with heterogeneous dimensions to 2D numpy array
我的数据是 3D 的,但只有第三个轴具有已知维度,我需要将其转换为 2D 数组。
示例:
input =
[[[1, 2, 3]],
[[4, 5, 6],
[7, 8, 9]],
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]]
input_reshaped =
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
所以我有一个 3D 数据,其中第一维和第二维在我的数据集中是可变的,第三维是常量并且是已知的。
输入中的每个块也是 numpy 数组。我知道我可以使用 numpy.vstack 并迭代第一维来执行此操作。但如果可能的话,我想以 pythonic 方式进行重塑,而无需明确迭代我的数据。
我已经尝试执行列表综合以获得每个块的第一个形状,然后对这些值求和并将其与重塑一起使用。像这样:
def myStack(a):
lengths = [item.shape[0] for item in a]
common_dim = a[0].shape[1]
return a.reshape(np.sum(lengths), common_dim)
但是在前面的例子中输入,我得到以下错误:
ValueError: cannot reshape array of size 3 into shape (6,3)
因为 Python 看到输入有一个 numy.array 形状为 (3,)
有什么想法吗?
补充:如果可以的话,在上面的条件下做一个反向变形就厉害了!
根据评论中的建议,vstack
或 concatenate
:
In [320]: alist
Out[320]: [[[1, 2, 3]], [[4, 5, 6], [7, 8, 9]], [[1, 2, 3], [4, 5, 6], [7, 8, 9]]]
In [321]: len(alist)
Out[321]: 3
尝试从列表中创建一个数组只会创建一维列表数组。帮助不大。 reshape
不行。
In [322]: np.array(alist)
Out[322]:
array([list([[1, 2, 3]]), list([[4, 5, 6], [7, 8, 9]]),
list([[1, 2, 3], [4, 5, 6], [7, 8, 9]])], dtype=object)
但是 concatenate
可以处理数组列表(或类似对象的数组):
In [323]: np.concatenate(alist, axis=0)
Out[323]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
concatenate
也可以与 Out[322]
一起使用,因为它会将其输入视为一个列表,即使它是一个数组。
vstack
是同一件事,只是它确保子数组都是二维的,在这种情况下它们已经是二维的。
我的数据是 3D 的,但只有第三个轴具有已知维度,我需要将其转换为 2D 数组。
示例:
input =
[[[1, 2, 3]],
[[4, 5, 6],
[7, 8, 9]],
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]]
input_reshaped =
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
所以我有一个 3D 数据,其中第一维和第二维在我的数据集中是可变的,第三维是常量并且是已知的。
输入中的每个块也是 numpy 数组。我知道我可以使用 numpy.vstack 并迭代第一维来执行此操作。但如果可能的话,我想以 pythonic 方式进行重塑,而无需明确迭代我的数据。
我已经尝试执行列表综合以获得每个块的第一个形状,然后对这些值求和并将其与重塑一起使用。像这样:
def myStack(a):
lengths = [item.shape[0] for item in a]
common_dim = a[0].shape[1]
return a.reshape(np.sum(lengths), common_dim)
但是在前面的例子中输入,我得到以下错误:
ValueError: cannot reshape array of size 3 into shape (6,3)
因为 Python 看到输入有一个 numy.array 形状为 (3,)
有什么想法吗?
补充:如果可以的话,在上面的条件下做一个反向变形就厉害了!
根据评论中的建议,vstack
或 concatenate
:
In [320]: alist
Out[320]: [[[1, 2, 3]], [[4, 5, 6], [7, 8, 9]], [[1, 2, 3], [4, 5, 6], [7, 8, 9]]]
In [321]: len(alist)
Out[321]: 3
尝试从列表中创建一个数组只会创建一维列表数组。帮助不大。 reshape
不行。
In [322]: np.array(alist)
Out[322]:
array([list([[1, 2, 3]]), list([[4, 5, 6], [7, 8, 9]]),
list([[1, 2, 3], [4, 5, 6], [7, 8, 9]])], dtype=object)
但是 concatenate
可以处理数组列表(或类似对象的数组):
In [323]: np.concatenate(alist, axis=0)
Out[323]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
concatenate
也可以与 Out[322]
一起使用,因为它会将其输入视为一个列表,即使它是一个数组。
vstack
是同一件事,只是它确保子数组都是二维的,在这种情况下它们已经是二维的。