【问题标题】:Replace values in specific columns of a numpy array替换 numpy 数组的特定列中的值
【发布时间】:2023-03-20 22:39:02
【问题描述】:

我有一个 N x M numpy 数组(矩阵)。这是一个 3 x 5 数组的示例:

x = numpy.array([[0,1,2,3,4,5],[0,-1,2,3,-4,-5],[0,-1,-2,-3,4,5]])

我想扫描x 的所有列,如果每列的值等于特定值,则替换它们。 例如,此代码旨在将所有负值(值等于列号)替换为 100:

for i in range(1,6):
    x[:,i == -(i)] = 100 

此代码获得此警告:

DeprecationWarning: using a boolean instead of an integer will result in an error in the future

我正在使用 numpy 1.8.2。如何在不降级 numpy 的情况下避免此警告?

【问题讨论】:

  • 这样做不会在 1.9.2 上产生警告
  • 是的,但是 1.8.2 呢?
  • @bernie OP 是 probably on an older version of python。似乎从 2.7 开始,默认情况下会抑制开发人员警告。
  • 您是说您正在替换所有负值。但在您的循环中,i == -(i) 仅当 i == 0 时为 True。但是由于range(1, 6)i 永远不会为 0。所以,您在循环中执行了 6 次x[:, False]。这是你想要的吗?

标签: python arrays numpy replace


【解决方案1】:

我没有按照您的代码尝试执行的操作:

i == -(i)

评估结果如下:

x[:, True]
x[:, False]

我认为这不是你想要的。你应该尝试这样的事情:

for i in range(1, 6):
    mask = x[:, i] == -i
    x[:, i][mask] = 100

在整个列上创建一个掩码,并使用它来更改值。

【讨论】:

    【解决方案2】:

    即使没有警告,您那里的代码也不会执行您想要的操作。 i 是循环索引,只有当 i == 0 时才等于减去自身,这永远不会。您的测试将始终返回 false,即强制转换为 0。换句话说,您的代码会将每行的第一个元素替换为 100。

    为了让它发挥作用,我会这样做

    for i in range(1, 6):
        col = x[:,i]
        col[col == -i] = 100
    

    请注意,您使用数组的名称进行屏蔽,并且您需要将常规索引与屏蔽分开

    【讨论】:

      【解决方案3】:

      如果您担心警告会喷出文本,请将其作为警告/异常忽略:

      import numpy
      import warnings
      
      
      warnings.simplefilter('default')  # this enables DeprecationWarnings to be thrown
      
      
      x = numpy.array([[0,1,2,3,4,5],[0,-1,2,3,-4,-5],[0,-1,-2,-3,4,5]])
      
      with warnings.catch_warnings():
          warnings.simplefilter("ignore")  # and this ignores them
          for i in range(1,6):
              x[:,i == -(i)] = 100
      print(x)  # just to show that you are actually changing the content
      

      正如您在 cmets 中看到的,有些人没有收到 DeprecationWarning。那可能是因为python suppresses developer-only warnings since 2.7

      【讨论】:

        【解决方案4】:

        正如其他人所说,您的循环并没有按照您认为的那样做。我建议您更改代码以使用 numpy 的精美索引。

        # First, create the "test values" (column index):
        >>> test_values = numpy.arange(6)
        # test_values is array([0, 1, 2, 3, 4, 5])
        #
        # Now, we want to check which columns have value == -test_values:
        #
        >>> mask = (x == -test_values) & (x < 0)
        # mask is True wherever a value in the i-th column of x is negative i
        >>> mask
        array([[False, False, False, False, False, False],
               [False,  True, False, False,  True,  True],
               [False,  True,  True,  True, False, False]], dtype=bool)
        #
        # Now, set those values to 100
        >>> x[mask] = 100
        >>> x
        array([[  0,   1,   2,   3,   4,   5],
               [  0, 100,   2,   3, 100, 100],
               [  0, 100, 100, 100,   4,   5]])
        

        【讨论】:

          猜你喜欢
          • 2013-09-11
          • 2021-01-17
          • 2018-01-25
          • 2019-09-26
          • 2012-05-07
          • 2018-11-19
          • 2015-01-16
          • 2020-04-13
          • 1970-01-01
          相关资源
          最近更新 更多