我是MATLAB用户。 将以下MATLAB脚本移植到python
的最简单方法是什么?a = []
for i=1:10
for j=1:10
a(i,j) = i*j
end
end
问题是关于动态使用np.ndarrays。在MATLAB中,我可以在不知道其大小的情况下初始化一个通用的ndarray(通过a = []),然后使用显式索引a(i,j)。 在Python中有.append方法,但是当使用ndarrays时,它会让我感到困惑,因为它需要首先打包行的元素,然后将行打包在一起,或类似的东西。我更喜欢显式索引。这有可能与动态数组相关,或者只能使用固定大小的数组来完成吗?
谢谢!
答案 0 :(得分:2)
运行MATLAB时查看显示
a = 1
a =
1 2
a =
1 2 3
a =
1 2 3 4
.... (so on for 100 iterations)
在Octave,我可以做到:
>> i=1:10
i =
1 2 3 4 5 6 7 8 9 10
>> j=(1:10)'
j =
1
2
3
4
5
6
7
8
9
10
>> a=i+j
a =
2 3 4 5 6 7 8 9 10 11
3 4 5 6 7 8 9 10 11 12
4 5 6 7 8 9 10 11 12 13
5 6 7 8 9 10 11 12 13 14
6 7 8 9 10 11 12 13 14 15
7 8 9 10 11 12 13 14 15 16
8 9 10 11 12 13 14 15 16 17
9 10 11 12 13 14 15 16 17 18
10 11 12 13 14 15 16 17 18 19
11 12 13 14 15 16 17 18 19 20
这利用了广播,这是一个从numpy借来的概念
In [500]: i=np.arange(1,11)
In [501]: a = i[:,None] + i
In [502]: a
Out[502]:
array([[ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
[ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
[ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
[ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
[ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
[ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
[ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
[ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18],
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
[11, 12, 13, 14, 15, 16, 17, 18, 19, 20]])
这是最佳实践 - 在numpy中,我敢说MATLAB和Octave。
但是如果你必须使用迭代做类似的事情
In [503]: a=np.zeros((10,10),int)
In [504]: for i in range(10):
...: for j in range(10):
...: a[i,j]=i+j
或者使用完整的python列表迭代:
In [512]: alist = []
In [513]: for i in range(10):
...: sublist=[]
...: for j in range(10):
...: sublist.append(i+j)
...: alist.append(sublist)
...:
In [514]: alist
Out[514]:
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
[6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
[7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
[8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
[9, 10, 11, 12, 13, 14, 15, 16, 17, 18]]
In [515]: np.array(alist)
Out[515]:
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
[ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
[ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
[ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
[ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
[ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
[ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
[ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]])
但我可以使用
更紧凑地生成alist
alist=[[i+j for i in range(10)] for j in range(10)]
当您构建列表列表时,请确保所有子列表都具有相同的长度 - 否则您将回到问题所在。