【问题标题】:python: replacing negative values in array read from filepython:替换从文件读取的数组中的负值
【发布时间】:2016-05-10 23:08:37
【问题描述】:

我正在填充一个数组,从文件中读取数据:

输入:

2
4
-8
5
-2

代码:

f = [ i.strip() for i in open('file.txt', 'r') ]
a = []

for line in f:
   line = line.split()
   a.append(float(line[0]))

产生向量a=[2,4,-8,5,-2]。现在我想用它们的值 +10 替换所有负值,以获得向量b=[2,4,2,5,8]。如果不使用循环或for 循环,我该怎么做?我尝试使用np.where() 函数和a[a<0],但它们不会产生任何结果(如果我创建一个np.array[2,4,-8,5,-2] ex novo...,它们就可以工作)。提前谢谢你。

【问题讨论】:

  • 为什么不在i.strip() for... 循环中这样做?
  • 不管你选择使用什么功能,毕竟会有一个循环。
  • -11 会变成什么? -1 或再次加 10 得到 +9?

标签: python arrays replace where


【解决方案1】:

一种不使用 numpy 的方法

a = list(map(lambda x:x+10 if x < 0 else x, a))

【讨论】:

  • 很高兴在这里看到一个实用的答案。编写此符号的更 Pythonic 方式是 a = [x+10 if x < 0 else x for x in a]
【解决方案2】:

您可以将 a 设为一个 numpy 数组:

a = np.array(a)

然后简单地做:

a[a<0] += 10

【讨论】:

  • 在我看来,Numpy 太过分了,除非你正在读取大量的值并对它们进行性能关键的计算。在 python 中有一种简单的二进制过滤值的方法,即使用 if-else 表达式。
  • @machineyearning 但是 OP 明确表示“不使用循环或 for 循环”......如果列表理解实际上是一个 for 循环,有人可能会争论。
  • 在这种情况下,我还会质疑 numpy 数组迭代是否使用某种循环。我读过 OP 的意思是他想要一种用单个表达式而不是语法块来完成它的方法。不过,我离题了,OP 确实提到了 numpy,因此实际上可能是这样的情况,即这是一组需要处理的大型且对性能至关重要的数字。在这种情况下,由 OP 选择适合他/她需要的正确答案。
【解决方案3】:

不使用 NumPy 也可以通过列表理解来完成。假设你有一个数字列表:

>>> a = [2, 4, -8, 5, -2]
>>> [number if number >= 0 else number + 10 for number in a]
[2, 4, 2, 5, 8]

【讨论】:

    【解决方案4】:

    如果允许使用 numpy:

    import numpy as np
    
    f = [ i.strip() for i in open('C:/Users/simon/Desktop/file.txt', 'r') ]
    a = []
    
    for line in f:
       line = line.split()
       a.append(float(line[0]))
    
    a = np.array(a)
    
    print a
    
    a[a<0] = a[a<0] + 10
    
    print a
    

    这会给你:

    [ 2.  4. -8.  5. -2.]
    [ 2.  4.  2.  5.  8.]
    

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 2023-03-17
      • 2012-05-07
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      相关资源
      最近更新 更多