Python Numpy阵列上的两个for循环
早上好。假设我有一个二维数组,叫做MATx,y,是用numpy创建的。在这个数组上,我必须执行一些操作。如何重写以下2个for循环,例如使用np.nditer或其他使用numpy方法的方法?多谢各位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 您可以像这样简单地设置第一行和第一
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