#python #arrays #numpy
Вопрос:
У меня есть задание, в котором я должен сопоставить имя из списка с определенным целым числом в массиве (надеюсь, я правильно использовал терминологию). Я написал этот код, но он не работает. Почему это так, и как я могу заставить это работать?
list_1 = ['sentosa', 'versicolor', 'virginica', 'virginica', 'sentosa']
beta = np.array([])
for x in list_1:
if x == "sentosa":
np.append(beta, [1], axis = 0)
elif x == "versicolor":
np.append(beta, [2], axis = 0)
elif x == "virginica":
np.append(beta, [3], axis = 0)
Ответ №1:
Массивы NumPy имеют фиксированный размер, они на самом деле не являются приложением. То, что вы делаете, будет происходить очень медленно, даже если вы исправите ошибки. Вместо этого используйте простой список и при необходимости преобразуйте его в массив NumPy в конце.
Комментарии:
1. @Amateur1: Отлично. Добро пожаловать в Stack Overflow. Вы можете «принять» этот ответ, нажав на галочку слева.
Ответ №2:
как исправить ваш код
numpy.append
не на месте, поэтому вам нужно будет назначить обратно вывод:
list_1 = ['sentosa', 'versicolor', 'virginica', 'virginica', 'sentosa']
beta = np.array([])
for x in list_1:
if x == "sentosa":
beta = np.append(beta, [1], axis = 0)
elif x == "versicolor":
beta = np.append(beta, [2], axis = 0)
elif x == "virginica":
beta = np.append(beta, [3], axis = 0)
как эффективно делать то, что вы хотите
Вы можете использовать numpy.unique
эту return_inverse=True
опцию для факторизации своих данных:
np.unique(list_1, return_inverse=True)[1] 1
выход: array([1, 2, 3, 3, 1])
Ответ №3:
Чтобы сопоставить список строк с уникальными целыми числами, нужно сначала найти уникальные строки, а затем выполнить 1-1 сопоставление строк с целыми числами в исходном списке строк.
list_1 = ['sentosa', 'versicolor', 'virginica', 'virginica', 'sentosa']
# create unique list of names
unique_list = set(list_1) # Unique list {'sentosa', 'versicolor', 'virginica'}
# create mappings from names to integer (id)
string_to_integer = {name: idx 1 for idx, name in enumerate(unique_list)}
# map initial list of names to ids
k = [string_to_integer [name] for name in list_1 ]
выход:
3, 2, 1, 1, 3
Другой возможный способ —
list_1 = ['sentosa', 'versicolor', 'virginica', 'virginica', 'sentosa']
mydict={}
i = 0
for item in list_1:
if(i>0 and item in mydict):
continue
else:
i = i 1
mydict[item] = i
k=[]
for item in list_1:
k.append(mydict[item])
1, 2, 3, 3, 1
Затем переключитесь на numpy array
arr = numpy.asarray(k)
Я надеюсь, что это поможет вам выполнить ваше задание.