我想以这种方式拆分2D数组:
实施例
从这个4x4 2D阵列:
np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
创建这四个2x2 2D阵列:
np.array([[1,2],[3,4]])
np.array([[5,6],[7,8]])
np.array([[9,10],[11,12]])
np.array([[13,14],[15,16]])
在一般情况下,从NxN 2D阵列(正方形阵列)创建尽可能多的KxK形状的2D阵列。
更确切地说:要创建输出数组,不一定要使用行中的所有值。
示例:
从2D 8x8数组中,值为1到64,如果我想在2D 2x2数组中拆分此数组,则8x8数组中的第一行是1到8的行,第一个输出2D 2x2数组将是是np.array([[1,2],[3,4]]),第二个输出2D 2x2数组将是np.array([[5,6],[7,8]])...它一直持续到最后一个输出2D数组,即np.array([[61,62],[63,64]])。看看每个2D 2x2数组都没有填充行中的所有值(CORRECT)。
有一种Numpy方法可以做到这一点吗?
答案 0 :(得分:3)
您可能正在寻找类似numpy.reshape
的内容。
在你的例子中:
numpy.array([[1,2,3,4], [5,6,7,8]]).reshape(2,4)
>>>array([[1,2], [3,4], [5,6], [7,8]])
或者,正如@MSeifert所建议的那样,使用-1作为最终维度会让numpy单独进行除法:
numpy.array([[1,2,3,4], [5,6,7,8]]).reshape(2,-1)
>>>array([[1,2], [3,4], [5,6], [7,8]])
答案 1 :(得分:2)
要获得所需的输出,您需要重塑为3D阵列,然后解压缩第一维:
>>> inp = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
>>> list(inp.reshape(-1, 2, 2))
[array([[1, 2],
[3, 4]]),
array([[5, 6],
[7, 8]]),
array([[ 9, 10],
[11, 12]]),
array([[13, 14],
[15, 16]])]
如果要将数组存储在不同的变量而不是一个数组列表中,也可以使用=
解压缩:
>>> out1, out2, out3, out4 = inp.reshape(-1, 2, 2)
>>> out1
array([[1, 2],
[3, 4]])
如果您对包含2D 2x2阵列的3D阵列感到满意,则无需解压缩或list()
来电:
>>> inp.reshape(-1, 2, 2)
array([[[ 1, 2],
[ 3, 4]],
[[ 5, 6],
[ 7, 8]],
[[ 9, 10],
[11, 12]],
[[13, 14],
[15, 16]]])
-1
是reshape
的特殊值。正如documentation所述:
一个形状尺寸可以是-1。在这种情况下,该值是从数组长度和剩余维度推断出来的。
如果您希望它更通用,只需取行长的平方根并将其用作reshape
的参数:
>>> inp = np.ones((8, 8)) # 8x8 array
>>> square_shape = 2
>>> inp.reshape(-1, square_shape, square_shape) # 16 2x2 arrays
>>> square_shape = 4
>>> inp.reshape(-1, square_shape, square_shape) # 4 4x4 arrays
答案 2 :(得分:0)
如果你想逐行拆分,你可以做np.reshape(arr,(2,2),order ='C') 如果你想按列分割它,你可能没有.reshape(arr,(2,2),order ='F')