Python 如何使用填充的0';s
我有一个Numpy数组,看起来像Python 如何使用填充的0';s,python,arrays,numpy,reshape,Python,Arrays,Numpy,Reshape,我有一个Numpy数组,看起来像 array([1, 2, 3, 4, 5, 6, 7, 8]) array([[[ 5, 0, 0, 6], [ 0, 1, 2, 0], [ 0, 3, 4, 0], [ 7, 0, 0, 8]], [[13, 0, 0, 14], [ 0, 9, 10, 0], [ 0, 11, 12, 0], [15, 0,
array([1, 2, 3, 4, 5, 6, 7, 8])
array([[[ 5, 0, 0, 6],
[ 0, 1, 2, 0],
[ 0, 3, 4, 0],
[ 7, 0, 0, 8]],
[[13, 0, 0, 14],
[ 0, 9, 10, 0],
[ 0, 11, 12, 0],
[15, 0, 0, 16]],
...
[[93, 0, 0, 94],
[ 0, 89, 90, 0],
[ 0, 91, 92, 0],
[95, 0, 0, 96]]])
我想把它重塑成一个数组
array([[5, 0, 0, 6],
[0, 1, 2, 0],
[0, 3, 4, 0],
[7, 0, 0, 8]])
更具体地说,我正在尝试重塑2D numpy阵列,以获得一个3D numpy阵列
array([[ 1, 2, 3, 4, 5, 6, 7, 8],
[ 9, 10, 11, 12, 13, 14, 15, 16],
[17, 18, 19, 20, 21, 22, 23, 24],
...
[ 9, 10, 11, 12, 13, 14, 15, 16],
[89, 90, 91, 92, 93, 94, 95, 96]])
到一个看起来像
array([1, 2, 3, 4, 5, 6, 7, 8])
array([[[ 5, 0, 0, 6],
[ 0, 1, 2, 0],
[ 0, 3, 4, 0],
[ 7, 0, 0, 8]],
[[13, 0, 0, 14],
[ 0, 9, 10, 0],
[ 0, 11, 12, 0],
[15, 0, 0, 16]],
...
[[93, 0, 0, 94],
[ 0, 89, 90, 0],
[ 0, 91, 92, 0],
[95, 0, 0, 96]]])
使用numpy功能,特别是矢量化功能,有没有一种有效的方法来实现这一点?我们可以使用
切片-
def expand(a): # a is 2D array
out = np.zeros((len(a),4,4),dtype=a.dtype)
out[:,1:3,1:3] = a[:,:4].reshape(-1,2,2)
out[:,::3,::3] = a[:,4:].reshape(-1,2,2)
return out
好处是内存,因此性能更好。效率,因为只有输出会占用内存空间。由于对输入和输出进行了切片,因此所涉及的步骤可以处理视图
样本运行-
二维输入:
In [223]: a
Out[223]:
array([[ 1, 2, 3, 4, 5, 6, 7, 8],
[ 9, 10, 11, 12, 13, 14, 15, 16]])
In [224]: expand(a)
Out[224]:
array([[[ 5, 0, 0, 6],
[ 0, 1, 2, 0],
[ 0, 3, 4, 0],
[ 7, 0, 0, 8]],
[[13, 0, 0, 14],
[ 0, 9, 10, 0],
[ 0, 11, 12, 0],
[15, 0, 0, 16]]])
1D输入(以None
输入2D扩展输入):
输入是否总是有8个元素?对于2D,每行8个元素?是的,输入有固定数量的元素。对于二维,这是每行(不是每列)8个元素。对于2D,我希望能够对任意数量的行执行此操作,尽管发布的解决方案对您有效吗?是的,它有效,谢谢!