Python Numpy阵列-将三维阵列转换为二维阵列
具有以下3D阵列(9,9,9): np.arange(729).重塑((9,9,9)) 如何将其重塑为二维阵列(27,27):Python Numpy阵列-将三维阵列转换为二维阵列,python,arrays,numpy,Python,Arrays,Numpy,具有以下3D阵列(9,9,9): np.arange(729).重塑((9,9,9)) 如何将其重塑为二维阵列(27,27): 可以首先将阵列重塑为4d阵列,交换第二轴和第三轴,然后将其重塑为27 X 27: a.reshape(3,3,9,9).transpose((0,2,1,3)).reshape(27,27) #array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 81, 82, 83, 84, # 85,
可以首先将阵列重塑为4d阵列,交换第二轴和第三轴,然后将其重塑为27 X 27:
a.reshape(3,3,9,9).transpose((0,2,1,3)).reshape(27,27)
#array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 81, 82, 83, 84,
# 85, 86, 87, 88, 89, 162, 163, 164, 165, 166, 167, 168, 169,
# 170],
# [ 9, 10, 11, 12, 13, 14, 15, 16, 17, 90, 91, 92, 93,
# 94, 95, 96, 97, 98, 171, 172, 173, 174, 175, 176, 177, 178,
# 179],
# ...
# [558, 559, 560, 561, 562, 563, 564, 565, 566, 639, 640, 641, 642,
# 643, 644, 645, 646, 647, 720, 721, 722, 723, 724, 725, 726, 727,
# 728]])
如果您同意在列表中移动数据,则可以使用:
np.hstack([x for x in np.arange(729).reshape((9,9,9))])
解释
我曾经为每个轴排列步幅和形状信息
>>> x.strides
(324L, 36L, 4L)
>>> x.transpose(1, 0, 2).strides
(36L, 324L, 4L)
更多信息在此
然后我按照预期在2D中使用3D(9L,9L,9L)
>>> x.reshape(27, 27)
(27L, 27L)
当然,函数的组合(如转置
和重塑
)在numpy
中非常常见。它允许您在一行中执行此矩阵变换:
x.transpose(1, 0, 2).reshape(27, 27)
编辑
正如@PaulPanzer所指出的,该阵列未排序
要实现这一点,可以使用:
y[y[:,2].argsort()]
但是,也许这不再是最简单的答案。从您给出的示例来看,您所做的似乎不仅仅是重塑——还包括变换阵列。例如,第一行从8跳到81。您试图实现的转换规则是什么?很好。回答得很清楚。@jamesclean很可能是,但也可能是错的。看看结果的第二排。@PaulPanzer该死的你是对的,我错了^^没有注意到我们中最好的;-)@保尔坦克,纠正它!然而,我不确定这是否是最好的答案了。。。Thx指出这一点,尽管这也给出了错误的结果,但不要介意形状错误,展平输出中的元素#27不符合规定。事实上,它和另一个答案一样是错误的。谢谢你,你的解决方案非常有效,但是我在我的问题上犯了一个错误并对其进行了编辑。你能提出一个新问题而不是编辑当前问题吗?这会使答案无效?如果你给我链接的话,我可以帮你。很抱歉,谢谢
>>> x.reshape(27, 27)
(27L, 27L)
x.transpose(1, 0, 2).reshape(27, 27)
y[y[:,2].argsort()]