说出两个2D阵列,a
和b
import numpy as np
a = np.random.rand(3, 4)
b = np.random.zeros(8, 8)
和b
在两个轴上总是大于a
。
(编辑:b
初始化为零数组,以反映未被a
占用的所有元素将保持为零的事实。)
问题即可。什么是最快的或大多数Pythonic 方式"插入" a
进入b
?
到目前为止,我已尝试了两件事:
np.pad
来"转" a
成一个形状(8, 8)
a
中的每一行,并将其放在b
我没有尝试尝试使用双重嵌套循环迭代a
的每个元素,因为我认为这不是对性能友好的。
动机即可。每个数组a
都是一个很小的字符,我想将每个字符提供给一个接受扁平形状(8, 8)
数组的神经网络,即。形状(64,)
的数组。 (我认为我不能简单地将a
压平到一个维度并用零填充它,因为它的二维结构会变形,所以,我必须先#&# 34;重塑"它改为(8, 8)
,对吗?)那里有数百万个字符。
答案 0 :(得分:4)
怎么样:
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
答案 1 :(得分:2)
更一般地说,如果创建切片元组,则可以确定要插入数组的位置(这适用于任意维度):
>>> 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]])
理想情况下,人们可以使用它 - 如果你经常使用它。
答案 2 :(得分:0)
我认为最好的方法是使用填充。
如果你想在左上角放置一个:
np.pad(a,((0,5),(0,4)),'constant')
如果你想放置一个中心:
np.pad(a,((2,3),(2,2)),'constant')