gpt4 book ai didi

python - Numpy 在矩阵中获取相邻索引或值的有效方法

转载 作者:行者123 更新时间:2023-11-28 17:57:45 25 4
gpt4 key购买 nike

假设您有一个包含字符串的矩阵 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com