一般来说,我们可以有任意大小的矩阵。对于我的应用程序,必须有方阵。虚拟条目也应该有一个指定的值。我想知道numpy是否有内置的东西?
或者最简单的方法
编辑 :
矩阵 X 已经存在并且它不是平方的。我们想要填充该值以使其成为正方形。用虚拟给定值填充它。所有原始值将保持不变。
非常感谢
基于 LucasB 的答案,这里有一个函数,它将M
用给定的值填充任意矩阵val
,使其变为正方形:
def squarify(M,val):
(a,b)=M.shape
if a>b:
padding=((0,0),(0,a-b))
else:
padding=((0,b-a),(0,0))
return numpy.pad(M,padding,mode='constant',constant_values=val)
从 Numpy 1.7 开始,就有了这个numpy.pad
功能。这是一个例子:
>>> x = np.random.rand(2,3)
>>> np.pad(x, ((0,1), (0,0)), mode='constant', constant_values=42)
array([[ 0.20687158, 0.21241617, 0.91913572],
[ 0.35815412, 0.08503839, 0.51852029],
[ 42. , 42. , 42. ]])
对于 2D numpy 数组m
,通过创建一个max(m.shape)
xmax(m.shape)
数组p
并将其乘以所需的填充值,在将p
对应于m
(ie p[0:m.shape[0], 0:m.shape[1]]
) 的切片设置为等于之前,这很简单m
。
这导致以下函数,其中第一行处理输入只有一个维度的可能性(即是数组而不是矩阵):
import numpy as np
def pad_to_square(a, pad_value=0):
m = a.reshape((a.shape[0], -1))
padded = pad_value * np.ones(2 * [max(m.shape)], dtype=m.dtype)
padded[0:m.shape[0], 0:m.shape[1]] = m
return padded
因此,例如:
>>> r1 = np.random.rand(3, 5)
>>> r1
array([[ 0.85950957, 0.92468279, 0.93643261, 0.82723889, 0.54501699],
[ 0.05921614, 0.94946809, 0.26500925, 0.02287463, 0.04511802],
[ 0.99647148, 0.6926722 , 0.70148198, 0.39861487, 0.86772468]])
>>> pad_to_square(r1, 3)
array([[ 0.85950957, 0.92468279, 0.93643261, 0.82723889, 0.54501699],
[ 0.05921614, 0.94946809, 0.26500925, 0.02287463, 0.04511802],
[ 0.99647148, 0.6926722 , 0.70148198, 0.39861487, 0.86772468],
[ 3. , 3. , 3. , 3. , 3. ],
[ 3. , 3. , 3. , 3. , 3. ]])
或者
>>> r2=np.random.rand(4)
>>> r2
array([ 0.10307689, 0.83912888, 0.13105124, 0.09897586])
>>> pad_to_square(r2, 0)
array([[ 0.10307689, 0. , 0. , 0. ],
[ 0.83912888, 0. , 0. , 0. ],
[ 0.13105124, 0. , 0. , 0. ],
[ 0.09897586, 0. , 0. , 0. ]])
等等