我有一个包含三千个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值的数组,请解释一下。
运算符*
和+
在数组和列表上的行为不同。
在数组中,它们按元素逐个计算操作。在列表中,它们会重复或扩展列表。
例如:
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)
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 Dhimansent_splt
和 stop_set
包含不同类型的对象。前者包含 list
对象,而后者包含 str
对象。因此,当 a
在 sent_splt
中时,条件 a not in stop_set
总是为 True
。 - Tristan Nemoz列表中的所有内容都是字符串,将字符串乘以-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))]
l = [1,2,3] * 2 # l == [1,2,3,1,2,3]
l = [int(s) * -1 for s in labels]
# with maybe an additional conversion back to strings:
l = map(str, l)
您的列表包含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]
将字符串转换为整数并使用列表推导式进行乘法运算:
list_of_numbers = ['0', '1', '0', '1']
a = [int(i) * -1 for i in list_of_numbers]
print(a)
result:
[0, -1, 0, -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]
print([int(x) * -1 for x in labels])
或者 numpy 数组print(np.array(labels).astype(int)*-1)
。此外,您还可以在这里查看更多信息。 - JvdV