Numpy принимает только первый символ строки - PullRequest
2 голосов
/ 27 марта 2019

Ниже приведена упрощенная версия моей проблемы. Я хочу создать массив numpy (N, 1) shape, в котором в качестве значений будут использоваться строки. Однако, когда я пытаюсь вставить строку, вставляется только первый символ строки.

Что я здесь не так делаю?

>>> import numpy as np
>>> N = 23000
>>> Y = np.empty((N, 1), dtype=str)
>>> Y.shape
(23000, 1)
>>> for i in range(N):
...     Y[i] = "random string"
...
>>> Y[10]
array(['r'], dtype='<U1')

Ответы [ 2 ]

3 голосов
/ 27 марта 2019

По умолчанию тип данных str имеет длину 1. Таким образом, вы получите только один персонаж. мы можем установить максимальную длину данных, используя np.dtype('U100'). Un, где U - это юникод, а n - количество символов в нем.

Попробуйте код ниже

>>> import numpy as np
>>> N = 23000
>>> Y = np.empty((N, 1), dtype=np.dtype('U100'))
>>> Y.shape
(23000, 1)
>>> for i in range(N):
...     Y[i] = "random string"
...
>>> Y[10]
array(['random string'], dtype='<U100')
2 голосов
/ 27 марта 2019

Даже если вы укажете dtype=str в np.empty, когда вы проверяете Y, это не тип строки.

import numpy as np
N = 23000
Y = np.empty((N, 1), dtype=str)
Y

Вывод:

array([[''],
       [''],
       [''],
       ...,
       [''],
       [''],
       ['']], dtype='<U1')

Тип d"U1".

Это означает, что строка в юникоде имеет длину 1.

Вы можете изменить его на

Y = np.empty((N, 1), dtype='U25')

Вывод для Y[10]:

array(['random string'], dtype='<U25')

Я дал случайное значение 25 для «U25».Вы можете дать любой номер там.25 здесь.

25 в U25 означает строку Unicode длиной 25

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