#python #numpy
#python #numpy
Вопрос:
Вот код, который я пытаюсь выполнить
matrix = []
sample = [10,10,'mike','']
for i in range(10):
r = [sample] * 3
matrix.append(r)
matrix = np.array(matrix)
matrix[1][1] = [123,123,'james', 'sdfsdfsdf werwerwer sdfsdfsd werwerwer sdfsdfsdf']
print matrix[1][1]
и вот что я получаю
['123' '123' 'james' 'sdfsdfsdf w']
таким образом, по какой-то причине текст обрезается. Кто-нибудь видел это раньше?
Ответ №1:
Я нашел проблему.
преобразование из собственного массива Python в Numpy должно выполняться в качестве последнего шага.
matrix[1][1] = [123,123,'james', 'sdfsdfsdf werwerwer sdfsdfsd werwerwer sdfsdfsdf']
matrix = np.array(matrix)
Теперь работает нормально.
Комментарии:
1. Массив не является хорошим форматом для хранения комбинации чисел и строк различной длины.
Ответ №2:
Ваше решение:
matrix[1][1] = [123,123,'james', 'sdfsdfsdf werwerwer sdfsdfsd werwerwer sdfsdfsdf']
matrix = np.array(matrix)
работает только потому, что, если вы не укажете тип данных в методе array, numpy установит для него наименьший возможный размер для хранения всех данных.
Если бы из терминала python взаимодействия, который вы ввели matrix[1][1]
, вы бы получили:
array(['123', '123', 'james', 'sdfsdfsdf werwerwer s'], dtype='|S21')
dtype указывает, что это строка длиной 21 символ. Именно поэтому ваш текст усекается. Когда вы реализуете свою структуру массива, вы должны указать dtype, если в какой-то момент позже захотите увеличить размер данных.
matrix = np.array(matrix, dtype='S50')
matrix[1][1] = [123,123,'james', 'sdfsdfsdf werwerwer sdfsdfsd werwerwer sdfsdfsdf']
print matrix[1][1]
['123' '123' 'james' 'sdfsdfsdf werwerwer sdfsdfsd werwerwer sdfsdfsdf']
Ответ №3:
Если вы не укажете dtype
, когда вы преобразуете свой список в массив, он будет использовать поведение по умолчанию. В вашем случае вы смешиваете int и strings, поэтому по умолчанию значение unicode <11:
>>> np.array([1,2,'a'])
array(['1', '2', 'a'],
dtype='<U11')
При попытке добавить новый элемент длиной более 11 он будет обрезан до dtype:
>>> x = np.array([1,2,'a'])
>>> x[2] = 'abcdefghijklmnopqrstuvwxyz'
>>> x
array(['1', '2', 'abcdefghijk'],
dtype='<U11')
Вы можете решить эту проблему, указав значение выше dtype
при создании массива:
>>> x = np.array([1,2,'a'], '<U50')
>>> x[2] = 'abcdefhijkmnopqrstuvwxyz'
>>> x
array(['1', '2', 'abcdefhijkmnopqrstuvwxyz'],
dtype='<U50')