将任意长度的向量重塑为方阵,并在 numpy 中填充

mot*_*iur 8 python numpy

我有一个任意长度的向量,我想把它改造成一个方阵,比如:

np.arange(6).reshape((3, 3))

[1,2,x]   [1,2,3]    
[3,4,x]   [4,5,6]
[5,6,x]   [x,x,x] 
Run Code Online (Sandbox Code Playgroud)

x可以是水平和/或垂直放置。

显然,reshape函数将只允许在上面的例子中像 (3,2) 这样的参数。有没有办法产生方形矩阵的效果。谢谢。

hpa*_*ulj 7

您必须在重塑之前或之后填充阵列。

例如,使用该resize方法添加所需的 0:

In [409]: x=np.arange(6)
In [410]: x.resize(3*3)
In [411]: x.shape
Out[411]: (9,)
In [412]: x.reshape(3,3)
Out[412]: 
array([[0, 1, 2],
       [3, 4, 5],
       [0, 0, 0]])
Run Code Online (Sandbox Code Playgroud)

np.resize复制值。 np.pad添加 0 也很方便,尽管它可能会矫枉过正。

np.arange(6)我们之前或之后重塑垫。随着np.arange(5)我们必须坚持前,因为填充,将不规则的。

In [409]: x=np.arange(6)
In [410]: x.resize(3*3)
In [411]: x.shape
Out[411]: (9,)
In [412]: x.reshape(3,3)
Out[412]: 
array([[0, 1, 2],
       [3, 4, 5],
       [0, 0, 0]])
Run Code Online (Sandbox Code Playgroud)

无论如何,没有一个函数可以在一次调用中完成所有这些操作——至少我不知道。这不是一个足够常见的操作。


per*_*sse 5

您可以定义最近的正方形,然后将数组带到它并重塑

import numpy as np
n = np.random.randint(10, 200)
a = np.arange(n)
ns = np.ceil(np.sqrt(n)).astype(int)
s = np.zeros(ns**2)
s[:a.size] = a
s = s.reshape(ns,ns)
Run Code Online (Sandbox Code Playgroud)