使用append函数创建2D numpy数组



我想在python中创建一个维度为Nx2的2D numpy数组。我想通过使用2个for循环来创建它。我可以用以下代码在Matlab中轻松构建这个阵列

matrix = [];
for i = 1:3
for j = 1:4
temp = [i, j];
matrix = [matrix; temp];
end
end

我已经试过很多次了,但都失败了。通常,当我运行for循环时,我得到的错误与不匹配的数组大小有关。

代码的输出是

matrix =
1     1
1     2
1     3
1     4
2     1
2     2
2     3
2     4
3     1
3     2
3     3
3     4

这里有一个函数,它可以执行您想要的操作,并使用两个for循环。N是+1,M是+1的原因是,在python中,range((函数返回一系列数字,默认情况下从0开始,增量为1(默认情况下(,并以指定的数字结束。因此,由于我们从1而不是0开始,我们需要添加1,以便实际范围是正确的。即,0.4是4的范围,但1,4实际上只是3的范围。希望能有所帮助-Brack

import numpy as np

def Nx2(N, M):
matrix=[]
n = N+ 1
m= M + 1
for i in range(1,n):
for j in range(1,m):
temp=[i,j]
matrix.append(temp)
final_matrix = np.array(matrix)
return final_matrix
print(Nx2(3, 4))
matrix= []
for i in range(1,4):
for j in range(1,5):
temp= [i,j]
matrix.append(temp)

最后,您可以使用将列表列表转换为numpy数组matrix = np.array(matrix)

您真的不需要MATLAB或numpy中的循环。在这两种语言中,与向量化代码时运行的隐藏循环相比,显式循环往往速度较慢。在循环中追加的另一个问题是,每个操作都会重新分配整个数组来添加新元素。您希望尽可能多地避免追加和预分配。

两个包都具有meshgrid功能。在numpy中你可以做:

ii = np.arange(3) + 1
jj = np.arange(4) + 1
j, i = np.meshgrid(jj, ii)
matrix = np.stack((i.ravel(), j.ravel()), axis=1)

在MATLAB中,它将非常相似:

ii = 1:3;
jj = 1:4;
[i, j] = meshgrid(ii, jj);
matrix = [i(:) j(:)];

如果你绝对需要在一个不断重新分配的循环中这样做,MATLAB循环很容易转换为numpy。使用np.appendnp.concatenate:而不是隐式vertcat

matrix = np.array((0, 2));
for i in range(1, 4)
for j in range(1, 5)
temp = [[i, j]]
matrix = np.append(matrix, temp, axis=0)

最新更新