Как получить символы в строке и столбце? - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь извлечь слова из двумерного массива, поэтому мне нужно выполнить проверку строк и столбцов, чтобы я мог получить символы.

Пример: У меня естьмассив, который содержит двумерное измерение, которое показано на этой фотографии Нажмите здесь , и это код, который хранит массив.Я уже изменил его размер до 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 голосов
/ 19 января 2019

В этом случае вы можете перебирать строки и столбцы (используя индексацию) и использовать списки для удаления 0 s. Рассмотрим следующий пример

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 s должен выглядеть следующим образом:

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 является списком, этот метод также может обнаружить два или более слов в одной строке или столбце.

0 голосов
/ 19 января 2019

Это способ достичь того, что вы хотите сделать без 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 дважды от него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...