Массив Numpy обрезает строковые значения

#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')