Numpy добавление из списка

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

Я надеюсь, что это поможет вам выполнить ваше задание.