Python 与动态和混乱作斗争

Python 与动态和混乱作斗争,python,numpy,Python,Numpy,我是一个MATLAB用户。 将以下MATLAB脚本移植到python的最简单方法是什么 a = [] for i=1:10 for j=1:10 a(i,j) = i*j end end 问题是关于动态使用np.ndarray。在MATLAB中,我可以在不知道其大小的情况下将a初始化为通用ndarray(通过a=[]),然后使用显式索引a(I,j)。 Python中有.append方法,但当使用Ndarray时,我会感到困惑,因为它需要先打包行的元素,然后再打

我是一个MATLAB用户。 将以下MATLAB脚本移植到python的最简单方法是什么

a = []
for i=1:10
    for j=1:10
        a(i,j) =  i*j
    end
end
问题是关于动态使用np.ndarray。在MATLAB中,我可以在不知道其大小的情况下将a初始化为通用ndarray(通过a=[]),然后使用显式索引a(I,j)。 Python中有.append方法,但当使用Ndarray时,我会感到困惑,因为它需要先打包行的元素,然后再打包行,或者类似的东西。我更喜欢显式索引。这是否可以与动态阵列结合使用,或者仅使用固定大小的阵列就可以实现


谢谢

运行MATLAB时,请查看显示

a =  1
a =
   1   2
a =
   1   2   3
a =
   1   2   3   4
.... (so on for 100 iterations)
在八度音阶中,我可以做到:

>> 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和倍频程

但如果必须使用迭代,请执行以下操作

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=[[i+j for i in range(10)] for j in range(10)]

构建列表列表时,请确保所有子列表的长度都相同,否则您会带着疑问返回列表。

运行MATLAB时,请查看显示

a =  1
a =
   1   2
a =
   1   2   3
a =
   1   2   3   4
.... (so on for 100 iterations)
在八度音阶中,我可以做到:

>> 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和倍频程

但如果必须使用迭代,请执行以下操作

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=[[i+j for i in range(10)] for j in range(10)]

当你建立一个列表列表时,确保所有子列表都有相同的长度,否则你会带着疑问回到原来的长度。

对于循环和动态分配,在Matlab和Python中都是不好的做法。如果你必须这样迭代,从
a=np.zeros((10,10),dtype=int)
开始。Matlab的数组实际上不是动态的。与numpy数组一样,如果不创建新数组并复制所有数据,则无法调整MATLAB数组的大小。只是MATLAB假装要调整它们的大小,而numpy没有。For循环和动态分配在MATLAB和Python中都是不好的做法。从
a=np.zeros((10,10),dtype=int)开始,如果你必须这样迭代。MATLAB的数组实际上不是动态的。与numpy数组一样,如果不创建新数组并复制所有数据,则无法调整MATLAB数组的大小。只是MATLAB假装调整了它们的大小,而numpy没有。