我有一个由0和1值组成的数组。如果我把它乘以-1,结果会得到一个空数组。为什么?

3

我有一个包含三千个0和1值的数组"labels"。如果我将其乘以-1,结果会得到一个空数组。我不明白为什么会出现这种情况?

输入

print(labels[0:10])

输出

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

现在,如果我执行以下操作:
labels=labels*(-1)
print(labels)

返回值:

[]

我原本期望一个包含0和-1值的数组,请解释一下。

2
那似乎是一个列表,而不是一个数组。 - user2357112
1
可以使用列表推导式:print([int(x) * -1 for x in labels]) 或者 numpy 数组 print(np.array(labels).astype(int)*-1)。此外,您还可以在这里查看更多信息。 - JvdV
6个回答

4

运算符*+在数组和列表上的行为不同。

在数组中,它们按元素逐个计算操作。在列表中,它们会重复或扩展列表。

例如:

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)

除了练习,没有什么神奇的方法。幸运的是,你很快就会习惯它,不用担心! - Tristan Nemoz
我在这里做错了什么?sent_splt=[['good', 'case,', 'excellent', 'value.'], ['great', 'for', 'the', 'jawbone.'],['tied', 'to', 'charger', 'for', 'conversations', 'lasting', 'more', 'than', '45', 'minutes.major', 'problems!!']] stop_set = ['the', 'a', 'an', 'i', 'he', 'she', 'they', 'to', 'of', 'it', 'from'] x=[a for a in sent_splt if a not in stop_set] print(x)它没有过滤单词。我试图过滤停用词。 - Deepak Dhiman
实际上,它告诉我在最近两天休息一天后再发布问题。基本上,由于我之前的问题不符合stackoverflow标准,我不能发布问题。对此造成的不便,我深感抱歉。 - Deepak Dhiman
1
如果我理解正确的话,这是因为 sent_spltstop_set 包含不同类型的对象。前者包含 list 对象,而后者包含 str 对象。因此,当 asent_splt 中时,条件 a not in stop_set 总是为 True - Tristan Nemoz
谢谢 @g2i,我想就是这样。感谢您的回复 :) - Deepak Dhiman
显示剩余2条评论

3

列表中的所有内容都是字符串,将字符串乘以-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))]

FYI:与推导式相同的解决方案:labels = [int(labels[i]) * -1 for i in range(len(labels))],可以稍微提高性能。 - DerHamm
谢谢。这是我一个很愚蠢的问题!我们如何自己解决这些疑问?我对编程非常陌生。 - Deepak Dhiman

3
在Python中,列表的乘法运算并不是将该操作应用于每个元素,而是整个列表。
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)

2

您的列表包含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]

1

将字符串转换为整数并使用列表推导式进行乘法运算:

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

result:

[0, -1, 0, -1]

1

您不能直接对列表进行算术运算,而且您的列表显然包含字符串,因此请尝试以下操作:

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接