繁体   English   中英

将二维数组插入(更大的)二维数组的最快方法

[英]Fastest way to insert a 2D array into a (larger) 2D array

假设有两个二维数组, ab

import numpy as np
a = np.random.rand(3, 4)
b = np.random.zeros(8, 8)

并且b在两个轴上始终大于a

(编辑: b被初始化为零的阵列,以反映所有元素不占据的事实a将保持为零)。

问题 a插入b最快最 Pythonic 的方法是什么?

到目前为止,我已经尝试了两件事:

  1. 使用np.pada变成形状为(8, 8)的数组
  2. 遍历每一行a ,并将其放置在相应的一些列b

还没有尝试过使用双重嵌套循环来迭代a每个元素,因为我认为这对性能不友好。

动机 每个数组a都是一个小字符,我想将每个字符提供给一个神经网络,该网络接受形状为(8, 8)扁平数组,即。 形状为(64,)数组。 (我我不能简单地将a展平到一维并用零填充它,因为这样它的二维结构会变形,所以,相反,我必须首先将它“重塑”为(8, 8) ,对吧?)数百万个字符。

关于什么 :

b[:a.shape[0],:a.shape[1]] = a

注意我假设a将放在b的开头,但您可以稍微改进一下以将a放在任何地方:

a0,a1=1,1
b[a0:a0+a.shape[0],a1:a1+a.shape[1]] = a

更一般地说,如果您创建切片元组(这适用于任意维度),您可以确定要插入数组的位置:

>>> a = np.random.random((5,5))
>>> b = np.ones((3,3))

>>> edge_coordinate = (0,0)
>>> slicer = tuple(slice(edge, edge+i) for edge, i in zip(edge_coordinate, b.shape))
>>> a[slicer] = b
>>> a
array([[ 1.        ,  1.        ,  1.        ,  0.14206495,  0.36385016],
       [ 1.        ,  1.        ,  1.        ,  0.08861402,  0.7888898 ],
       [ 1.        ,  1.        ,  1.        ,  0.1975496 ,  0.13345192],
       [ 0.550487  ,  0.22471952,  0.47050879,  0.04669643,  0.13480528],
       [ 0.25139511,  0.06499812,  0.42247189,  0.05840351,  0.74735495]])

通过改变edge_coordinate你可以改变位置:

>>> a = np.random.random((5,5))
>>> b = np.ones((3,3))

>>> edge_coordinates = (1,1)  # changed
>>> slicer = tuple(slice(edge, edge+i) for edge, i in zip(edge_coordinates, b.shape))
>>> a[slicer] = b
>>> a
array([[ 0.21385714,  0.68789872,  0.3915475 ,  0.67342566,  0.05642307],
       [ 0.19778658,  1.        ,  1.        ,  1.        ,  0.70717406],
       [ 0.73678924,  1.        ,  1.        ,  1.        ,  0.90285997],
       [ 0.39709332,  1.        ,  1.        ,  1.        ,  0.96959814],
       [ 0.89627195,  0.21295355,  0.72598992,  0.80749348,  0.76660287]])

理想情况下,一个人可以利用它——如果你经常使用它。

我认为最好的方法是使用填充。

如果你想在左上角放置一个:

np.pad(a,((0,5),(0,4)),'constant') 

如果你想在中心放置一个:

np.pad(a,((2,3),(2,2)),'constant')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM