У меня есть массив с 0 и 1 значениями. Если я умножу это на -1, это приведет к пустому массиву. Почему? - PullRequest
3 голосов
/ 21 апреля 2020

У меня есть массив «меток» с тремя тысячами значений 0 и 1. Если я умножу это на -1, это приведет к пустому массиву. Я не могу понять, почему это приводит к 0?

Вход

print(labels[0:10])

Выход

['0', '1', '1', '0', '1', '0', '0', '1', '0', '0']

Теперь, если я делаю:

labels=labels*(-1)
print(labels)

Возвращает:

[]

Я ожидал массив с 0 и -1 значениями. Пожалуйста, объясните.

Ответы [ 6 ]

3 голосов
/ 21 апреля 2020

Операция умножения для списков в python не apply операция для каждого из элементов, а скорее весь список.

l = [1,2,3] * 2 # l == [1,2,3,1,2,3]

Принимая это во внимание: умножение на 0 приведет к в пустом списке и что-либо ниже 0 не имеет смысла, так что это также просто пустой список (я думаю, что здесь было бы целесообразно вызвать здесь исключение / valueerror, но, увы, сегодня это не так).

То, что вы хотите сделать, это умножить каждый элемент на -1:

l = [int(s) * -1 for s in labels]
# with maybe an additional conversion back to strings:
l = map(str, l)
3 голосов
/ 21 апреля 2020

Ваш список имеет str значений. Так что сделайте это:

In [1945]: l = ['0', '1', '1', '0', '1', '0', '0', '1', '0', '0']
In [1949]: [int(i) *(-1) for i in l]                                                                                                                                                                        
Out[1949]: [0, -1, -1, 0, -1, 0, 0, -1, 0, 0]
3 голосов
/ 21 апреля 2020

Все в списке - строка, умножение строки на -1 - ничто:

print('1'*-1)

Ничего не печатает. Поэтому в вашем случае массив пуст.

Это можно исправить следующим образом:

for i in range (len(labels)):
    labels[i]=int(labels[i])*-1
print(labels)

Здесь каждый из элементов сначала преобразуется в целое число, а затем умножается .

Или как DerHamm предложил:

labels = [int(labels[i]) * -1 for i in range(len(labels))]
2 голосов
/ 21 апреля 2020

Операторы * и + не работают одинаково для массивов и списков.

Для массива он вычисляет операцию поэлементно. В списке это повторяет или расширяет список.

Например:

a = [1, 2, 3]
print(a * 2)  # prints [1, 2, 3, 1, 2, 3]
print(np.array(a) * 2)  # prints np.array(2, 4, 6)

Следовательно, независимо от типа его элемента, объект list, умноженный на -1, является пустым список. Преобразуйте свой список в массив перед выполнением операции:

labels = np.array(labels).astype(int) # Since you have a list of str
labels = labels * (-1)
print(labels)
1 голос
/ 21 апреля 2020

Вы не можете использовать арифметику c непосредственно в списке, и ваш список содержит строки, поэтому попробуйте это:

test = ['0', '1', '1', '0', '1', '0', '0', '1', '0', '0']
test = [x*-1 for x in list(map(int, test))]
test

[0, -1, -1, 0, -1, 0, 0, -1, 0, 0]
1 голос
/ 21 апреля 2020

Преобразовать строку в int и умножить, используя понимание списка:

list_of_numbers = ['0', '1', '0', '1']
a = [int(i) * -1 for i in list_of_numbers]
print(a)

result:

[0, -1, 0, -1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...