【问题标题】: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

标签: python arrays list


【解决方案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]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多