Python: Почему я не могу присвоить новое значение массиву в этом случае?

#python #arrays #numpy #variable-assignment

#python #массивы #numpy #переменная-назначение

Вопрос:

 import numpy as np

data = np.array([['Height', 'Weight'],['165', '48'],['168', '50'],['173', '53']])
data[0,0] = data[0,0]   "_1"
 

данные [0,0] — это «Высота», и я хочу заменить их на «Высоту_1». Но приведенный выше код не работает. Он вернул результат как:

 data[0,0]
 

‘Высота’

Элемент data[0,0] остался прежним. И если я заменю его напрямую, не обращаясь к самому себе, он все равно не будет работать.

 data[0,0] = "Height"   "_1"
 

Результат:

 data[0,0]
 

‘Высота’

Но если я заменю его некоторыми символами, отличными от «Height», это сработает.

 data[0,0] = "str"   "_1"
 

Результат:

 data[0,0]
 

‘str_1’

Я воспользовался этим случаем, чтобы объяснить проблему, с которой я столкнулся. И в моей работе я должен ссылаться на сам массив, потому что мне нужно заменить элементы, которые не соответствуют некоторым требованиям. У кого-нибудь есть решения по этому поводу? Спасибо.

Комментарии:

1. Я не думаю, что вам следует смешивать строки и целые числа вместе

2. @jamylak если быть точным, OP использует здесь только строки.

3. @juanpa.arrivillaga Я знаю, я имел в виду, что OP не должен включать заголовки столбцов в данные, а числа не должны сохраняться в виде строк

4. @jamylak Я согласен, но, возможно, в этом случае лучше быть конкретным.

Ответ №1:

Проблема в том, что ваш массив имеет dtype('<U6')

 >>> data = np.array([['Height', 'Weight'],['165', '48'],['168', '50'],['173', '53']])
>>> data.dtype
dtype('<U6')
>>> 
 

Он будет автоматически усекаться:

 >>> data[0,0] = "123456789"
>>> data
array([['123456', 'Weight'],
       ['165', '48'],
       ['168', '50'],
       ['173', '53']], 
      dtype='<U6')
>>> 
 

Вы всегда можете указать свой dtype как ‘object’ при создании своего массива, но это устраняет многие преимущества скорости numpy для начала.

Кроме того, вы можете указать более длинный строковый тип:

 >>> data
array([['Height', 'Weight'],
       ['165', '48'],
       ['168', '50'],
       ['173', '53']], 
      dtype='<U20')
>>> data[0,0]='Height_1'
>>> data
array([['Height_1', 'Weight'],
       ['165', '48'],
       ['168', '50'],
       ['173', '53']], 
      dtype='<U20')
>>> 
 

Но будьте осторожны, так как если вы слишком долго устанавливаете ограничение, вы будете тратить впустую память:

 >>> data = np.array([['Height', 'Weight'],['165', '48'],['168', '50'],['173', '53'], ['42','88']], dtype='U20')
>>> data.nbytes
800
>>> data = np.array([['Height', 'Weight'],['165', '48'],['168', '50'],['173', '53'], ['42','88']], dtype='U6')
>>> data.nbytes
240
 

Если вам нужно ограниченное количество символов, рассмотрите возможность использования байтовых строк (1/4 требования к памяти):

 >>> data = np.array([['Height', 'Weight'],['165', '48'],['168', '50'],['173', '53'], ['42','88']], dtype='S20')
>>> data.nbytes
200
>>> 
 

Комментарии:

1. или укажите более длинную строку dtype, например U20

Ответ №2:

укажите тип объекта для вашего массива, например:

 a = np.array([['Height', 'Weight'],['165', '48'],['168', '50'],['173', '53']],dtype=object)
 

Тогда,
a[0][0] ='_1' будет делать трюк, вы получите:

 array([['Height_1', 'Weight'],
       ['165', '48'],
       ['168', '50'],
       ['173', '53']], dtype=object)