【问题标题】:Reshape arbitrary length vector into square matrix with padding in numpy在numpy中使用填充将任意长度向量重塑为方阵
【发布时间】:2016-12-16 02:09:06
【问题描述】:

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

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) 这样的参数。有没有办法产生方形矩阵的效果。谢谢。

【问题讨论】:

  • 什么定义了正方形的形状?我也可以将它放入 7x7 中
  • 是的,可以做到。但是矩阵的每个维度都会接近向量长度的平方根。

标签: python numpy


【解决方案1】:

你必须在 reshape 之前或之后填充数组。

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

    【讨论】:

      猜你喜欢
      • 2021-03-16
      • 2018-05-08
      • 2015-03-12
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 2014-05-22
      • 1970-01-01
      相关资源
      最近更新 更多