最简单的方法来创建具有预定维度和值的矩阵

时间:2017-04-06 18:28:34

标签: python numpy

我有一个维度(2,5)的矩阵,我有一个值的向量来填充该矩阵。什么是最好的方法。我可以想到三种方法,但我无法使用np.empty & fillnp.full无循环

x=np.array(range(0,10))
mat=x.reshape(2,5)

array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

mat=np.empty((2,5))
newMat=mat.fill(x)   # Error: The x has to be scalar

mat=np.full((2,5),x)   # Error: The x has to be scalar

3 个答案:

答案 0 :(得分:2)

fullfill用于设置所有元素相同

In [557]: np.full((2,5),10)
Out[557]: 
array([[10, 10, 10, 10, 10],
       [10, 10, 10, 10, 10]])

如果形状匹配(在广播意义上),则分配数组:

In [558]: arr[...] = x.reshape(2,5)   # make source the same shape as target
In [559]: arr
Out[559]: 
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
In [560]: arr.flat = x    # make target same shape as source
In [561]: arr
Out[561]: 
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

arr.flatarr.ravel()是等效的。嗯,不完全是:

In [562]: arr.flat = x.reshape(2,5)   # don't need the [:] with flat @wim
In [563]: arr
Out[563]: 
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
In [564]: arr.ravel()[:] = x.reshape(2,5)
ValueError: could not broadcast input array from shape (2,5) into shape (10)
In [565]: arr.ravel()[:] = x.reshape(2,5).flat

flat适用于任何形状源,甚至是需要复制的源

In [570]: arr.flat = [1,2,3]
In [571]: arr
Out[571]: 
array([[1, 2, 3, 1, 2],
       [3, 1, 2, 3, 1]])

更多广播输入

In [572]: arr[...] = np.ones((2,1))
In [573]: arr
Out[573]: 
array([[1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1]])
In [574]: arr[...] = np.arange(5)
In [575]: arr
Out[575]: 
array([[0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4]])

Eric提到的问题的一个例子。转置的混乱(或其他重塑)通常是一个副本。所以写到那不会修改原文。

In [578]: arr.T.ravel()[:]=10
In [579]: arr
Out[579]: 
array([[0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4]])
In [580]: arr.T.flat=10
In [581]: arr
Out[581]: 
array([[10, 10, 10, 10, 10],
       [10, 10, 10, 10, 10]])

答案 1 :(得分:1)

ndarray.flat返回一个可以通过直接赋值修改数组内容的对象:

>>> array = np.empty((2,5), dtype=int)
>>> vals = range(10)
>>> array.flat = vals
>>> array
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

如果这对您来说似乎有点神奇,那么请阅读descriptor protocol

警告:分配到平面不会引发大小不匹配的异常。如果赋值的右侧没有足够的值,则将滚动/重复数据。如果值太多,则仅使用前几个值。

答案 2 :(得分:-2)

如果你想要一个5x2的10x2矩阵

np.ones((10,2))*5

如果你有一个值列表,只想要它们的特定形状:

datavalues = [1,2,3,4,5,6,7,8,9,10]
np.reshape(datavalues,(2,5))

array([[ 1,  2,  3,  4,  5],
   [ 6,  7,  8,  9, 10]])