假设您有一个包含字符串的矩阵 A。
[["a", "A", ""],
["A", "a", ""],
["a", "", ""]]
目标是找到所有正交相邻大写字母且没有正交相邻小写字母的“正方形”。 结果应该是这样的:
[[True, False, True],
[False, True, False],
[True, False, False]]
现在,我到目前为止所做的是创建一个字典 adjSquares,它将每个正方形的笛卡尔索引与相邻正方形的笛卡尔索引联系起来。
每次我必须进行上述检查时,我都会执行以下操作:
np.reshape([any(isupper(A[i,j] for (i,j) in adjSquares[(row,col)])) and not any(islower(A[i,j] for (i,j) in adjSquares[(row,col)])) for row in range(3) for col in range(3)], (3,3))
有没有办法使用矢量化运算获得相同的结果?
最佳答案
这是一个基于 2D convolution
的+ 掩码
-
def getmask_based_on_lettercases(a):
# Generate "star" kernel wtih zero at center as the kernel
kernel = np.zeros((3,3),dtype=int)
kernel[:,1] = kernel[1] = 1
kernel[1,1] = 0
# Not empty cells mask
nE = a!=''
# Mask of at least one uppercase string neighborhood
U = (np.char.upper(a)==a) & nE
upper_and_not_empty = convolve2d(U,kernel,'same')>0
# Mask of at least one lowercase string neighborhood
L = (np.char.lower(a)==a) & nE
lower_and_not_empty = convolve2d(L,kernel,'same')>0
# Let's fulfil "no orthogonal adjacent lower case letters" case
return upper_and_not_empty & ~lower_and_not_empty
样本运行-
In [352]: a
Out[352]:
array([['a', 'A', ''],
['A', 'a', ''],
['a', '', '']], dtype='<U1')
In [353]: getmask_based_on_lettercases(a)
Out[353]:
array([[ True, False, True],
[False, True, False],
[ True, False, False]])
现在,让我们测试一下 - 没有正交相邻的小写字母
大小写,如问题中所述,通过将 a[2,1]
设置为小写字母 -
In [354]: a[2,1] = 'a'
In [355]: a
Out[355]:
array([['a', 'A', ''],
['A', 'a', ''],
['a', 'a', '']], dtype='<U1')
In [356]: getmask_based_on_lettercases(a)
Out[356]:
array([[ True, False, True],
[False, False, False],
[False, False, False]])
关于python - Numpy 在矩阵中获取相邻索引或值的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57431038/