Python3:如何用一维数组填充5x5的ones矩阵



我有一个5x5 ones矩阵:

[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]

我想用这个一维数组来填充它:

[0.72222515 1.25003225 0.11767353 0.16121767 0.27926356 0.78412963
0.08371721 1.77536532 1.67636045 0.55364691]

类似:

[[0.72222515 1.25003225 0.11767353 0.16121767 0.27926356]
[0.78412963 0.08371721 1.77536532 1.67636045 0.55364691]
[[0.72222515 1.25003225 0.11767353 0.16121767 0.27926356]
[0.78412963 0.08371721 1.77536532 1.67636045 0.55364691]
[[0.72222515 1.25003225 0.11767353 0.16121767 0.27926356]

在python中我能做什么?

我们可以用所需的布局创建一个新的数组,而不是填充现有的数组。

In [129]: arr = np.arange(10)

repeat是制作多个副本的快速方法。既然你是";填充";一次两行,让我们将repeat应用于1d数组-扩展到2d:

In [132]: arr[None,:].repeat(3,0)
Out[132]: 
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])

然后重塑为所需形状:

In [133]: arr[None,:].repeat(3,0).reshape(6,5)
Out[133]: 
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])

并使用切片来去除多余的行:

In [134]: arr[None,:].repeat(3,0).reshape(6,5)[:5,:]
Out[134]: 
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[0, 1, 2, 3, 4]])

即使我们走填充路线,使用10列ones:也是最简单的

In [135]: new = np.ones((3,10)); new[:] = arr    
In [136]: new
Out[136]: 
array([[0., 1., 2., 3., 4., 5., 6., 7., 8., 9.],
[0., 1., 2., 3., 4., 5., 6., 7., 8., 9.],
[0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]])
In [137]: new.reshape(-1,5)[:5,:]
Out[137]: 
array([[0., 1., 2., 3., 4.],
[5., 6., 7., 8., 9.],
[0., 1., 2., 3., 4.],
[5., 6., 7., 8., 9.],
[0., 1., 2., 3., 4.]])

也许我们可以用一个循环来做到这一点,比如。。。不确定这是否是最好的方式。。。

import numpy as np 
arr1 = np.ones((5,5))
arr2 = np.array([1,2,3,4,5,6,7,8,9,10])
arr2 = np.reshape(arr2, (-1, 5))
for i in range(0,len(arr1)):
if i % 2 == 0:
arr1[i] = arr2[0]
else:
arr1[i] = arr2[1]
# Output of arr1
array([[ 1.,  2.,  3.,  4.,  5.],
[ 6.,  7.,  8.,  9., 10.],
[ 1.,  2.,  3.,  4.,  5.],
[ 6.,  7.,  8.,  9., 10.],
[ 1.,  2.,  3.,  4.,  5.]])