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