我有一个4D麻木array.例如,我有2批3个二维矩阵,形状为(2,3,4,5). 在每一批中,我想水平地连接三个2D矩阵(在最后一个维度上).

输出形状应为(2、4、5*3).


使用形状(2,3,2,2)进行复制的较小示例:

a1, a2, a3, a4 = 2, 3, 2, 2
arr = np.arange(a1*a2*a3*a4).reshape((a1, a2, a3, a4))

[[[[ 0  1]
   [ 2  3]]

  [[ 4  5]
   [ 6  7]]

  [[ 8  9]
   [10 11]]]


 [[[12 13]
   [14 15]]

  [[16 17]
   [18 19]]

  [[20 21]
   [22 23]]]]

它的第一行(如果判断最后一个维度)应该是:[0, 1, 4, 5, 8, 9]

先谢谢你.

推荐答案

虽然可以使用某种形式的concatenate,但transpose通常适用于这类问题:

In [532]: arr.transpose(0,2,1,3).reshape(2,2,6)
Out[532]: 
array([[[ 0,  1,  4,  5,  8,  9],
        [ 2,  3,  6,  7, 10, 11]],

       [[12, 13, 16, 17, 20, 21],
        [14, 15, 18, 19, 22, 23]]])

在没有最终reshape 的情况下,第一条"线"是

In [533]: arr.transpose(0,2,1,3)
Out[533]: 
array([[[[ 0,  1],
         [ 4,  5],
         [ 8,  9]],

对于所有不同维度的示例

In [534]: x=np.ones((2,3,4,5))
In [535]: x.transpose(0,2,1,3).shape
Out[535]: (2, 4, 3, 5)
In [536]: x.transpose(0,2,1,3).reshape(2,4,3*5).shape
Out[536]: (2, 4, 15)

有时,弄清楚转置需要一些迭代和错误.但在这里,您希望保持第一个维度不变,也保持最后一个维度不变,因此我们只剩下交换中间的两个维度.

转置本身会生成一个视图,但最后一次reshape 必须创建一个副本,因为它会重新排序"解开"的值.

Python相关问答推荐

列表上值总和最多为K(以O(log n))的最大元素数

如何在箱形图中添加绘制线的传奇?

numba jitClass,记录类型为字符串

如果值不存在,列表理解返回列表

C#使用程序从Python中执行Exec文件

如何在Raspberry Pi上检测USB并使用Python访问它?

我想一列Panadas的Rashrame,这是一个URL,我保存为CSV,可以直接点击

用砂箱开发Web统计分析

在matplotlib中删除子图之间的间隙_mosaic

使用特定值作为引用替换数据框行上的值

判断solve_ivp中的事件

寻找Regex模式返回与我当前函数类似的结果

如何在Django模板中显示串行化器错误

如何从数据框列中提取特定部分并将该值填充到其他列中?

如何在Python中从html页面中提取html链接?

如何获取给定列中包含特定值的行号?

.awk文件可以使用子进程执行吗?

高效地计算数字数组中三行上三个点之间的Angular

函数()参数';代码';必须是代码而不是字符串

Scipy.linprog的可行性有问题吗?(A_ub@x0<;=b_ub).all()为True-但是-linprog(np.zeros_like(X0),A_ub=A_ub,b_ub=b_ub)不可行