如何获取行和列中的字符?

时间:2019-01-19 09:21:34

标签: python numpy

我正在尝试提取二维数组中的单词,因此我需要进行行和列检查,以便获得字符。

示例: 我有一个包含二维的数组,这张照片Click here中显示了该二维数组,这是存储该数组的代码。我已经将其尺寸调整为15x15

arr2 = np.array([my_list2])
arr2 = arr2.reshape(15,15)

问题是每次我提取字符时,它都不会给我苹果的a。 E A G L E P P L E

这是让我提取字符串的代码: board_size = 15 print(arr2)

for i in range(board_size):
    for j in range(board_size):
        val = arr2[i,j]
        if val != '0' :
        print(val)

` 我需要的输出是能够显示鹰和苹果。

2 个答案:

答案 0 :(得分:0)

这是一种无需numpy即可实现的目标的方法:

def print_non_0_len_ge_1(li):
    """removes 0 from front/back of line, prints rest of line if > 1 consecutive letter
    splitting at 0 between words."""
    for line in li:
        no_zero = ''.join(line).strip("0").split("0")
        for p in no_zero:
            if len(p)>1:
                print(*p,sep="\n")
                print("")   

data = [['0', '0', '0', '0', '0', '0', '0', '0', '0', '0'], 
        ['0', '0', '0', 'E', 'A', 'G', 'L', 'E', '0', '0'], 
        ['0', '0', '0', '0', 'P', '0', '0', '0', '0', '0'], 
        ['0', '0', '0', '0', 'P', '0', 'P', '0', '0', '0'],
        ['0', '0', '0', '0', 'L', '0', 'I', '0', '0', '0'], 
        ['0', '0', '0', 'C', 'E', 'R', 'E', 'A', 'L', '0'],
        ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0']]

# apply to lines
print_non_0_len_ge_1(data)

# apply to transposed data to get the columns
print_non_0_len_ge_1(zip(*data))  

输出:

E
A
G
L
E

C
E
R
E
A
L

A
P
P
L
E

P
I
E

如果使用numpy,也可以类似地解决它-只需删除开始/结尾0,在0处拆分并应用于法线和转置数据即可。

该方法有一个缺点-您需要在两个方向上的所有非单词形式字符之间使用0才能使其正常工作(您不能使用“ EGG”开头的广告“(E)agle”),因为两次获得GP

答案 1 :(得分:0)

在这种情况下,您可以遍历行和列(使用索引)并使用列表推导删除0。考虑以下示例

a = np.array([['T','E','S','T'],
['0','0','0','E'],
['0','0','0','S'],
['0','0','0','T']])
height,width = a.shape
for i in range(height):
    word = ''.join([j for j in a[i] if j!='0'])
    if len(word)>=2: print(word)
for i in range(width):
    word = ''.join([j for j in a[:,i] if j!='0'])
    if len(word)>=2: print(word)

输出:

TEST
TEST

a是硬编码的值,例如为了清楚起见,请注意a.shape的用法比魔术数字更优雅。

正如评论中指出的那样,它有一个原始形式的缺陷,为避免该问题,for的外观应如下:

for i in range(height)
    words = ''.join(a[i]).split('0')
    words = [i for i in words if len(i)>=2]
    if words: print(words)
for i in range(width):
    words = ''.join(a[:,i]).split('0')
    words = [i for i in words if len(i)>=2]
    if words: print(words)

请注意,现在words是列表,此方法还可以在一行或一列中检测到两个或多个单词。