Python Numpy阵列上的两个for循环

Python Numpy阵列上的两个for循环,python,arrays,numpy,Python,Arrays,Numpy,早上好。假设我有一个二维数组,叫做MATx,y,是用numpy创建的。在这个数组上,我必须执行一些操作。如何重写以下2个for循环,例如使用np.nditer或其他使用numpy方法的方法?多谢各位 for i in range(x): for j in range(y): if i == 0: MAT[i][j] = j elif j == 0: MAT[i][j] = i 您可以像这样简单地设置第一行和第一

早上好。假设我有一个二维数组,叫做MATx,y,是用numpy创建的。在这个数组上,我必须执行一些操作。如何重写以下2个for循环,例如使用np.nditer或其他使用numpy方法的方法?多谢各位

    for i in range(x): 
        for j in range(y): 

            if i == 0: MAT[i][j] = j   
            elif j == 0: MAT[i][j] = i

您可以像这样简单地设置第一行和第一列

mat[:,0]=np.arange0,mat.shape[0] 材料[0,:]=np.arange0,材料形状[1] 示例结果

array([[0.        , 1.        , 2.        , 3.        , 4.        ],
       [1.        , 0.30487009, 0.97179858, 0.08143348, 0.99363866],
       [2.        , 0.69357714, 0.98421733, 0.42032313, 0.81041628]])

由于您只是简单地赋值0,1,。。。对于第一行和第一列,不需要使用包含if条件的双循环

只需将值指定给第一行:

MAT[0] = np.arange(len(MAT[0])
到第一列:

MAT[:,0] = np.arange(len(MAT[:,0]))
基本上,您可以将np.arange分配给适当的输入切片

可以对输入foo2的2D特性进行硬编码,也可以使用动态定义的切片foon对任意尺寸进行硬编码:

请注意,双切片(例如MAT[i][j])在工作时不如使用元组(例如MAT[i,j])进行切片有效

最后,循环的嵌套在代码中基本上是未使用的,您可以通过将两个循环分开来重写它,这样效率更高:

def fool(arr):
    ii, jj = arr.shape
    for i in range(ii):
        arr[i, 0] = i
    for j in range(jj):
        arr[0, j] = j
    return arr
这很有趣,因为如果我们使用Numba加速代码:

fool_nb = nb.jit(fool)
fool_nb.__name__ = 'fool_nb'
这将产生最快的方法:

funcs = foo, foo2, foon, fool, fool_nb


shape = 300, 400
for func in funcs:
    arr = np.zeros(shape)
    print(func.__name__)
    %timeit func(arr)
    print()

# foo
# 100 loops, best of 3: 6.53 ms per loop

# foo2
# 100000 loops, best of 3: 4.28 µs per loop

# foon
# 100000 loops, best of 3: 6.99 µs per loop

# fool
# 10000 loops, best of 3: 89.8 µs per loop

# fool_nb
# 1000000 loops, best of 3: 1.01 µs per loop

您不需要循环,只需分配给slice即可

MAT[:,0]=np.arangex MAT[0,:]=np.arangey
funcs = foo, foo2, foon, fool, fool_nb


shape = 300, 400
for func in funcs:
    arr = np.zeros(shape)
    print(func.__name__)
    %timeit func(arr)
    print()

# foo
# 100 loops, best of 3: 6.53 ms per loop

# foo2
# 100000 loops, best of 3: 4.28 µs per loop

# foon
# 100000 loops, best of 3: 6.99 µs per loop

# fool
# 10000 loops, best of 3: 89.8 µs per loop

# fool_nb
# 1000000 loops, best of 3: 1.01 µs per loop