我有一个维度(2,5)的矩阵,我有一个值的向量来填充该矩阵。什么是最好的方法。我可以想到三种方法,但我无法使用np.empty & fill
和np.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
答案 0 :(得分:2)
full
和fill
用于设置所有元素相同
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.flat
和arr.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]])