我有一个包含 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_spltstop_set 不包含相同类型的对象。前者包含list 对象,后者包含str 对象。因此,a not in stop_set fo asent_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 相乘,则会产生空数组。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

解析:如果我将它与指针类型一起使用,“containedIn”将不返回任何内容

C# 比较两个包含小写文本的 byte[] 数组

使用浮点 NumPy 数组进行比较和相关操作

Vue:为数组属性设置默认值的最佳方法?

为numpy数组分配新值的问题[重复]

检查数组项的字符串(多个单词)