Список строк в массиве целых чисел - PullRequest
0 голосов
/ 22 октября 2018

Из списка строк, как этот:

example_list = ['010','101']

Мне нужно получить массив целых чисел, где каждая строка - каждая из строк, каждый символ в одном столбце, как этоодин:

example_array = np.array([[0,1,0],[1,0,1]])

Я пробовал с этим кодом, но он не работает:

example_array = np.empty([2,3],dtype=int)    
i = 0 ; j = 0

for string in example_list:
    for bit in string:
        example_array[i,j] = int(bit)
        j+=1
    i+=1

Кто-нибудь может мне помочь?Я использую Python 3.6.

Заранее благодарю за помощь!

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Если все строки имеют одинаковую длину (это важно для построения непрерывного массива), тогда используйте view для эффективного разделения символов.

r = np.array(example_list)
r = r.view('<U1').reshape(*r.shape, -1).astype(int)

print(r)
array([[0, 1, 0],
       [1, 0, 1]])

Вы также можете пойти по пути понимания списка.

r = np.array([[*map(int, list(l))] for l in example_list])

print(r)
array([[0, 1, 0],
       [1, 0, 1]])
0 голосов
/ 22 октября 2018

Самый простой способ - использовать понимание списка, потому что оно автоматически генерирует список вывода для вас, который может быть легко преобразован в пустой массив.Вы можете сделать это, используя несколько циклов for, но тогда вы застряли, создав свой список, подсписки и добавив к ним.Хотя это и не сложно, код выглядит более элегантно с учетом списка.

Попробуйте это:

newList = np.array([[int(b) for b in a] for a in example_list])

newList теперь выглядит следующим образом:

>>> newList
 ... [[0, 1, 0], [1, 0, 1]]

Примечание: здесь нет необходимости вызывать карту, хотя это, безусловно, работает,

Так что здесь происходит?Мы перебираем ваш первоначальный список строк (example_list) по пунктам, а затем перебираем каждый символ в текущем элементе.Функционально это эквивалентно ...

newList = []

for a in example_list:
    tmpList = []
    for b in a:
        tmpList.append(int(b))
    newList.append(tmpList)

newList = np.array(newList)

Лично я считаю, что кратность циклов for проще для начинающих.Однако, как только вы поймете список, вы, вероятно, не захотите возвращаться.

0 голосов
/ 22 октября 2018

Вы можете сделать это с помощью map:

example_array = map(lambda x: map(lambda y: int(y), list(x)), example_list)

Внешний lambda выполняет операцию list(x) для каждого элемента в example_list.Например, '010' => ['0','1','0'].Внутренний lambda преобразует отдельные символы (результирующие от list(x)) в целые числа.Например, ['0','1','0'] => [0,1,0].

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