【问题标题】:Changing a number into zero in a matrix将矩阵中的数字更改为零
【发布时间】:2018-03-06 16:05:37
【问题描述】:

我有以下矩阵:

a = array([
   [100. , 100., 100.],
   [175.2, 198.,  32.],
   [ 38. , 82. ,  38.],
   [155. , 32. ,  23.],
   [ 38. , 67. ,  30.]])

如果一行的数字不等于 38 和 32,我如何将所有行中的数字更改为零,但最后一行除外?我想得到如下:

a = array([
   [ 0 ,  0 ,  0 ],
   [ 0 ,  0 , 32.],
   [38.,  0 , 38.],
   [ 0 , 32.,  0 ],
   [38., 67., 30.]])

然后我想只留下每列中出现的最早的数字。像这样的:

a = array([
   [ 0 ,  0 ,  0 ],
   [ 0 ,  0 , 32.],
   [38.,  0 ,  0 ],
   [ 0 , 32.,  0 ],
   [ 0 ,  0 ,  0 ]])

【问题讨论】:

  • 你试图做什么?发布您修改数组的尝试,然后我们可以帮助您找出您做错了什么
  • Nitpick:这是一个数组,而不是矩阵。一般来说,这是一个重要的区别,因为 NumPy 确实 有一个 matrix 类型,它不同于(但继承自)ndarray 数组类型。
  • 对不起,你是对的。我尝试使用此评论 a[np.any(a != 38, axis=1)] = 0,但它给出的是它将所有内容都变为零,我不知道如何强加 - “将数字变为零如果数字不等于 38 或 32",则在除最后一行之外的所有行中

标签: python arrays python-3.x numpy


【解决方案1】:

应该这样做:

positions = [(y, x) for x, y in enumerate(np.argmax(np.isin(a, [32,38]), axis=0))]

result = np.zeros(a.shape)

for p in positions:
    result[p] = a[p]

#[[ 0 ,  0 ,  0 ],
# [ 0 ,  0 , 32.],
# [38.,  0 ,  0 ],
# [ 0 , 32.,  0 ],
# [ 0 ,  0 ,  0 ]]

【讨论】:

    【解决方案2】:

    这是一个矢量化的就地解决方案。

    import numpy as np
    
    a = np.array([[100. , 100., 100.],
                  [175.2, 198.,  32.],
                  [ 38. , 82. ,  38.],
                  [155. , 32. ,  23.],
                  [ 38. , 67. ,  30.]])
    
    a[:-1][(a[:-1]!=38) & (a[:-1]!=32)] = 0
    
    # array([[  0.,   0.,   0.],
    #        [  0.,   0.,  32.],
    #        [ 38.,   0.,  38.],
    #        [  0.,  32.,   0.],
    #        [ 38.,  67.,  30.]])
    

    您也可以使用numpy 作为最终结果:

    idx = ((a!=0).argmax(axis=0), np.array(range(a.shape[1])))
    result = np.empty(a.shape)
    result[idx] = a[idx]
    
    # array([[  0.,   0.,   0.],
    #        [  0.,   0.,  32.],
    #        [ 38.,   0.,   0.],
    #        [  0.,  32.,   0.],
    #        [  0.,   0.,   0.]])
    

    【讨论】:

      【解决方案3】:

      还有一个(尽管效率低下)解决方案:

      import numpy as np
      
      a = np.array([
         [100. , 100., 100.],
         [175.2, 198.,  32.],
         [ 38. , 82. ,  38.],
         [155. , 32. ,  23.],
         [ 38. , 67. ,  30.]])
      
      
      def what(y,lastRow):
          found = False
          for o in y:
              if o in [32,38] and not found and not lastRow:
                  found = True
                  yield o
              else:
                  yield 0
      
      # probably inefficient due to list comp instead of np-own ops
      b = np.array([list(what(y,idy==len(a)-1)) for idy,y in enumerate(a)]) 
      
      print(b)
      

      输出:

      [[  0.   0.   0.]
       [  0.   0.  32.]
       [ 38.   0.   0.]
       [  0.  32.   0.]
       [  0.   0.   0.]]
      

      【讨论】:

        猜你喜欢
        • 2017-12-04
        • 1970-01-01
        • 2020-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多