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

标签 python numpy matrix

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

相关文章:

multidimensional-array - 我在 matlab 中重建分解张量时遇到问题

python - TensorFlow 失败前提条件错误 : iterator has not been initialized

python - 在 Mac OSX 10.9 中通过自制程序安装 numpy 时出错

python - 读取带有开始/结束标签的结构化数据

python - Numpy loadtxt 跳过第一列

r - 有效地折叠矩阵

java - 如何使用 Protobuf 将数据从 Python 发送到 Java?

python - 谷歌云物联网 Python MQTT "out of memory"错误

python - 使用 setup.py 安装包时未创建 Pyenv shim

matlab - 如何从 nx3 矩阵 (n>m) 中删除 mx3 矩阵的行?