如何转换嵌套';对于';在python中循环到一行代码中
我有这个代码示例,我的任务是将虚线内的行减少为一行代码,这意味着将所有for循环转换为一行代码。 我自己想出了一个解决方案,就是:如何转换嵌套';对于';在python中循环到一行代码中,python,numpy,for-loop,image-processing,numpy-slicing,Python,Numpy,For Loop,Image Processing,Numpy Slicing,我有这个代码示例,我的任务是将虚线内的行减少为一行代码,这意味着将所有for循环转换为一行代码。 我自己想出了一个解决方案,就是: myMat.ravel()[::size + 1] = myMat.ravel()[::size - 1] = 1 除了我自己的解决方案之外,我认为'np.logical_or'函数在这里可能有助于组合阵列切片。 下面是函数。 多谢各位 def myXMat(size): if size != np.uint64(size): return
myMat.ravel()[::size + 1] = myMat.ravel()[::size - 1] = 1
除了我自己的解决方案之外,我认为'np.logical_or'函数在这里可能有助于组合阵列切片。下面是函数。 多谢各位
def myXMat(size):
if size != np.uint64(size):
return None
elif size == 1:
return 1.0
myMat = np.zeros((size, size), dtype=np.float64)
# -------------------------------------------------
for m in range(size):
for n in range(size):
if m == n or m == size - n - 1:
myMat[m, n] = 1
# -------------------------------------------------
return myMat
让我们了解全局;你在创造什么样的模式
In [343]: arr = np.zeros((10,10),int)
In [344]: for m in range(10):
...: for n in range(10):
...: if m==n or m==10-n-1:
...: arr[m,n] = 1
...:
In [345]: arr
Out[345]:
array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 1, 0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 1, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 1, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 1, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 1]])
这就是对角线和它的倒点
In [346]: np.diag(np.ones(10,int))
Out[346]:
array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1]])
把它翻过来:
In [347]: np.diag(np.ones(10,int))[::-1]
Out[347]:
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
把它们加起来:
In [348]: _346+_347
Out[348]:
array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 1, 0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 1, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 1, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 1, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 1]])
或使用索引:
In [352]: arr = np.zeros((10,10),int)
In [353]: arr[np.arange(10),np.arange(10)] = 1
In [354]: arr[np.arange(10)[::-1],np.arange(10)] = 1
使用位或
代替+和np.diag
处理奇数尺寸。