【发布时间】:2017-01-20 19:20:49
【问题描述】:
我有一个丑陋的、非蟒蛇式的野兽:
def crop(dat, clp=True):
'''Crops zero-edges of an array and (optionally) clips it to [0,1].
Example:
>>> crop( np.array(
... [[0,0,0,0,0,0],
... [0,0,0,0,0,0],
... [0,1,0,2,9,0],
... [0,0,0,0,0,0],
... [0,7,4,1,0,0],
... [0,0,0,0,0,0]]
... ))
array([[1, 0, 1, 1],
[0, 0, 0, 0],
[1, 1, 1, 0]])
'''
if clp: np.clip( dat, 0, 1, out=dat )
while np.all( dat[0,:]==0 ):
dat = dat[1:,:]
while np.all( dat[:,0]==0 ):
dat = dat[:,1:]
while np.all( dat[-1,:]==0 ):
dat = dat[:-1,:]
while np.all( dat[:,-1]==0 ):
dat = dat[:,:-1]
return dat
# Below gets rid of zero-lines/columns in the middle
#+so not usable.
#dat = dat[~np.all(dat==0, axis=1)]
#dat = dat[:, ~np.all(dat == 0, axis=0)]
如何驯服它,让它变得美丽?
【问题讨论】:
-
你确定函数文档中的例子是正确的吗?输出对应于输入?我看到不仅删除了零,而且看到了完全不同的数字。 :)
-
除此之外,我认为代码很好。鉴于您只是在 2D 中工作,几乎没有任何更好的解决方案。或者您的目标是在任意数量的维度上的通用解决方案?
-
我不需要一个通用的解决方案,但如果我有一个,那就更好了。至于“完全不同的数字”:该函数还将数组剪辑到区间
[0,1]。所以是的,两者对应(或者至少 doctest 没有抱怨)。 -
哦,我的错。我忘记了剪裁,我只专注于零的剪裁。你是对的,你的输入/输出示例是正确的。但是我建议将这两个功能分开 - 剪辑和裁剪应该分开 - 你知道规则:一个功能(或类)一个责任。
-
注意:
np.clip( dat, 0, 1, out=dat )也会对实际参数进行更改。我建议@SCB 在开头使用def crop(d, clp=True): dat = np.array(d)回答。