如何使用 try-except 计算 numpy 数组中的相邻单元格?
How to count neighbouring cells in a numpy array using try-except?
我有一个 numpy 数组:
x = np.random.rand(4, 5)
我想创建一个数组,显示原始数组中每个值有多少相邻值。我所说的邻居是指:
example=np.array([[0,1,0,0,0],
[1,2,1,0,0],
[0,1,0,0,0],
[0,0,0,0,0]])
plt.imshow(example)
位置 [1][1]
的值有 4 个邻居(黄色方块有 4 个相邻的绿色单元格)。
有效的解决方案:
x = np.random.rand(4, 5)
mask = 4*np.ones(x.shape, dtype=int)
mask[0][:]=3
mask[-1][:]=3
for each in mask: each[0]=3
for each in mask: each[-1]=3
mask[0][0]=2
mask[0][-1]=2
mask[-1][0]=2
mask[-1][-1]=2
mask
变为:
array([[2, 3, 3, 3, 2],
[3, 4, 4, 4, 3],
[3, 4, 4, 4, 3],
[2, 3, 3, 3, 2]])
现在我尝试用 try-except
:
创建相同的数组
x = np.random.rand(4, 5)
numofneighbours=[]
for index, each in enumerate(x):
row=[]
for INDEX, EACH in enumerate(each):
c=4
try:ap[index+1][INDEX]
except:c-=1
try:ap[index][INDEX+1]
except:c-=1
try:ap[index-1][INDEX]
except:c-=1
try:ap[index][INDEX-1]
except:c-=1
row.append(c)
numofneighbours.append(row)
numofneighbours=np.asarray(numofneighbours)
给出结果 numofneighbours
数组:
array([[4, 4, 4, 4, 3],
[4, 4, 4, 4, 3],
[4, 4, 4, 4, 3],
[3, 3, 3, 3, 2]])
这不等于 mask
,正如我预期的那样。
我在这里做错了什么或者我应该如何使用 try-except 来达到上述目的?
这里的问题是 numpy 允许负索引。 a[-1]
代表 a
中的最后一个值,这就是为什么数组中的第一个数字没有减少的原因。
我认为您描述的第一种方法比 try-except 方法更清晰、更快,您应该直接使用它。
意识到当index
和INDEX
等于0时index-1
和INDEX-1
指标仍然有效,它们只是具有值-1
,使它成为有效的数组索引,即使它们引用的值与 index
和 INDEX
引用的值不相邻。我的修复如下:
x = np.random.rand(4, 5)
numofneighbours=[]
for index, each in enumerate(x):
row=[]
for INDEX, EACH in enumerate(each):
c=4
try:x[index+1][INDEX]
except:c-=1
try:x[index][INDEX+1]
except:c-=1
try:x[index-1][INDEX]
except:c-=1
if (index-1)<0: c-=1
try:x[index][INDEX-1]
except:c-=1
if (INDEX-1)<0: c-=1
row.append(c)
numofneighbours.append(row)
numofneighbours=np.asarray(numofneighbours)
这给出:
array([[2, 3, 3, 3, 2],
[3, 4, 4, 4, 3],
[3, 4, 4, 4, 3],
[2, 3, 3, 3, 2]])
我有一个 numpy 数组:
x = np.random.rand(4, 5)
我想创建一个数组,显示原始数组中每个值有多少相邻值。我所说的邻居是指:
example=np.array([[0,1,0,0,0],
[1,2,1,0,0],
[0,1,0,0,0],
[0,0,0,0,0]])
plt.imshow(example)
位置 [1][1]
的值有 4 个邻居(黄色方块有 4 个相邻的绿色单元格)。
有效的解决方案:
x = np.random.rand(4, 5)
mask = 4*np.ones(x.shape, dtype=int)
mask[0][:]=3
mask[-1][:]=3
for each in mask: each[0]=3
for each in mask: each[-1]=3
mask[0][0]=2
mask[0][-1]=2
mask[-1][0]=2
mask[-1][-1]=2
mask
变为:
array([[2, 3, 3, 3, 2],
[3, 4, 4, 4, 3],
[3, 4, 4, 4, 3],
[2, 3, 3, 3, 2]])
现在我尝试用 try-except
:
x = np.random.rand(4, 5)
numofneighbours=[]
for index, each in enumerate(x):
row=[]
for INDEX, EACH in enumerate(each):
c=4
try:ap[index+1][INDEX]
except:c-=1
try:ap[index][INDEX+1]
except:c-=1
try:ap[index-1][INDEX]
except:c-=1
try:ap[index][INDEX-1]
except:c-=1
row.append(c)
numofneighbours.append(row)
numofneighbours=np.asarray(numofneighbours)
给出结果 numofneighbours
数组:
array([[4, 4, 4, 4, 3],
[4, 4, 4, 4, 3],
[4, 4, 4, 4, 3],
[3, 3, 3, 3, 2]])
这不等于 mask
,正如我预期的那样。
我在这里做错了什么或者我应该如何使用 try-except 来达到上述目的?
这里的问题是 numpy 允许负索引。 a[-1]
代表 a
中的最后一个值,这就是为什么数组中的第一个数字没有减少的原因。
我认为您描述的第一种方法比 try-except 方法更清晰、更快,您应该直接使用它。
意识到当index
和INDEX
等于0时index-1
和INDEX-1
指标仍然有效,它们只是具有值-1
,使它成为有效的数组索引,即使它们引用的值与 index
和 INDEX
引用的值不相邻。我的修复如下:
x = np.random.rand(4, 5)
numofneighbours=[]
for index, each in enumerate(x):
row=[]
for INDEX, EACH in enumerate(each):
c=4
try:x[index+1][INDEX]
except:c-=1
try:x[index][INDEX+1]
except:c-=1
try:x[index-1][INDEX]
except:c-=1
if (index-1)<0: c-=1
try:x[index][INDEX-1]
except:c-=1
if (INDEX-1)<0: c-=1
row.append(c)
numofneighbours.append(row)
numofneighbours=np.asarray(numofneighbours)
这给出:
array([[2, 3, 3, 3, 2],
[3, 4, 4, 4, 3],
[3, 4, 4, 4, 3],
[2, 3, 3, 3, 2]])