【问题标题】:Create a block numpy array from a numpy array of 2D numpy arrays efficiently有效地从二维 numpy 数组的 numpy 数组创建块 numpy 数组
【发布时间】:2016-12-18 09:11:23
【问题描述】:

先举个简单的例子

import numpy as np

a = np.ones((2,2))
b = 2*np.ones((2,2))
c = 3*np.ones((2,2))
d = 4*np.ones((2,2))
e = np.array([[a,b],[c,d]])
print(np.vstack(np.array([np.hstack(e[i,:]) for i in range(2)])))

产生

[[ 1.  1.  2.  2.]
 [ 1.  1.  2.  2.]
 [ 3.  3.  4.  4.]
 [ 3.  3.  4.  4.]]

这与print(np.bmat(e.tolist()))print(np.bmat([[a,b],[c,d]])) 的结果完全相同(以np.bmat 创建一个可以使用np.asarray() 强制转换的numpy 矩阵为模)。

但是,我的问题是我有一个代码,我在其中创建了一个 36 的大型 numpy 数组(目前,以后会变得更多,比如 400)2D numpy 数组,我想创建一个大块 numpy 数组其中。我想有效地做到这一点,如果可能的话,避免列表和 numpy 数组之间的任何转换,因为这是更大循环结构的一部分,因此将执行多次(每次数组都不同)。这可能吗?

【问题讨论】:

  • 好的,也许我不清楚。事实上,对于这个简单的例子来说,这是可行的。但在我真正的问题中,我创建了一个大的 numpy 数组,其中包含 2D numpy 数组,我不想将它转换为列表
  • 如果你有 36 个数组,也许初始化 o/p 数组然后迭代地切入 o/p 数组并进行分配是有意义的?
  • 我不太明白你的意思。数组的数量是我计划在不久的将来增加的参数的函数,所以它应该是完全自动的
  • 我的意思是你可以初始化一个 o/p 数组,out of shape(4,4) 然后切片并赋值:out[:2,:2] = a 等等。所有数组的形状都一样吗?
  • 所有数组的大小都相同,我知道(我设置的参数的函数)并且它们都是正方形的。一旦我开始使用 400 个或更多的数组,这样的分配效率会很低,不是吗?

标签: python arrays performance numpy


【解决方案1】:
np.swapaxes(e, 1, 2).reshape([4, 4])

如果您检查从e 绘制元素以产生我们想要的输出的顺序,您会发现我们想要沿着轴 3,然后是 1,然后是 2,然后是 0。reshape 绘制沿轴 3 的元素,然后是 2,然后是 1,然后是 0,所以我们在调用 reshape 之前交换轴 1 和 2。

【讨论】:

  • 这正是我所需要的。我只是要编辑我的问题并说我已经尝试过重塑,但它似乎不起作用。
猜你喜欢
  • 2015-07-13
  • 2023-01-04
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
相关资源
最近更新 更多