我有一个包含 0 和 1 值的数组。如果我将它与 -1 相乘,则会产生空数组。为啥?
Posted
技术标签:
【中文标题】我有一个包含 0 和 1 值的数组。如果我将它与 -1 相乘,则会产生空数组。为啥?【英文标题】:I have an array with 0 and 1 values. If I multiply this with -1, it results in empty array. Why?我有一个包含 0 和 1 值的数组。如果我将它与 -1 相乘,则会产生空数组。为什么? 【发布时间】:2020-04-21 11:40:54 【问题描述】:我有一个包含三千个 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 值的数组。请解释一下。
【问题讨论】:
这似乎是一个列表,而不是一个数组。 使用列表理解:print([int(x) * -1 for x in labels])
或 numpy 数组 print(np.array(labels).astype(int)*-1)
。也看看here
【参考方案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在 stop_set] print(x) 中没有过滤单词。我正在尝试过滤停用词。 我认为最好将此作为另一个问题发布以使用正确的代码格式。 如果我理解正确,这是因为sent_splt
和stop_set
不包含相同类型的对象。前者包含list
对象,后者包含str
对象。因此,a not in stop_set
fo a
在sent_splt
中的条件始终为True
。【参考方案2】:
列表中的所有内容都是字符串,字符串乘以 -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))]
【讨论】:
仅供参考:与理解相同的解决方案:labels = [int(labels[i]) * -1 for i in range(len(labels))] 略微提高性能。 谢谢。我问了这么愚蠢的问题!我们如何解决这些疑问?我对编程很陌生。【参考方案3】:python中列表的乘法运算不是apply
对每个元素的运算,而是整个列表。
l = [1,2,3] * 2 # l == [1,2,3,1,2,3]
考虑到这一点:乘以 0 会导致一个空列表,任何低于 0 的东西都没有意义,所以它也只是一个空列表(我相信在这里引发异常/值错误是有意义的,但是唉,今天不是这样)。
看起来你想做的是将每个元素乘以 -1:
l = [int(s) * -1 for s in labels]
# with maybe an additional conversion back to strings:
l = map(str, l)
【讨论】:
【参考方案4】:您的列表有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]
【讨论】:
【参考方案5】:将字符串转换为 int 并使用列表推导进行乘法:
list_of_numbers = ['0', '1', '0', '1']
a = [int(i) * -1 for i in list_of_numbers]
print(a)
结果:
[0, -1, 0, -1]
【讨论】:
【参考方案6】:您不能直接在列表上使用算术,并且您的列表显然包含字符串,所以试试这个:
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]
【讨论】:
以上是关于我有一个包含 0 和 1 值的数组。如果我将它与 -1 相乘,则会产生空数组。为啥?的主要内容,如果未能解决你的问题,请参考以下文章