2016-12-16 74 views
3

方陣填充予具有任意長度矢量,並且我想把它重塑成正方形矩陣,是這樣的:整形任意長度載體導入在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] 

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

顯然reshape函數在上例中只允許像(3,2)這樣的參數。有沒有辦法產生方形矩陣的效果。謝謝。

+0

什麼定義了正方形的形狀?我也可以將它放入7x7中 – percusse

+0

是的,它可以完成。但矩陣的每個維度都將接近矢量長度的平方根。 – motiur

回答

1

你必須墊陣列,之前或之後重塑。

例如,使用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]]) 

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]]) 

在任何情況下,都沒有一個函數在一次調用中完成所有這些 - 至少不是我所知道的。這不是一個常見的操作。

2

可以定義最接近的廣場,然後陣列攜帶它,重塑

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)