【问题标题】:Fill Numpy Array row wise逐行填充 Numpy Array
【发布时间】:2020-10-04 23:12:28
【问题描述】:

我正在试验 Numpy 功能,并想知道是否有一种方法可以实现所解释的所需行为。 给定一个如下所示的numpy数组

array = np.array([[1,3,3],[6,7,6],[9,9,4]])
print(array)

来自print(array)的输出

[[1 3 3]
 [6 7 6]
 [9 9 4]]

我得到了每一行的最大值

max_array =  array.max(axis=1,keepdims=1)
print(max_array)

来自print(max_array)的输出

[[3]
 [7]
 [9]]

我正在使用下面的代码对数组中的所有最大元素应用掩码

masked_array = np.ma.masked_equal(array,max_array)
print(masked_array)

打印输出(masked_array)

[[1 -- --]
 [6 -- 6]
 [-- -- 4]]

现在我已经屏蔽了数组,我想对数组中的非最大元素执行操作,例如乘以 3,如下面的代码所示

 mul_array= np.multiply(masked_array,3)
 print(mul_array)

来自print(mul_array)的输出

[[3 -- --]
 [18 -- 18]
 [-- -- 12]]

我想在 max_array 中插入之前在 mul_array 中相同位置屏蔽的最大元素,但我找不到任何东西来实现所需的行为。下面是我预期的矩阵。我想问一下是否有任何 Numpy 操作来实现所需的行为

期望的输出

[[3 3 3]
 [18 7 18]
 [9 9 12]]

感谢您的帮助!

【问题讨论】:

  • 欢迎来到 SO。这不是讨论论坛或教程。请使用tour 并花时间阅读How to Ask 以及该页面上的其他链接。
  • @wwii 感谢您推荐资源。我已经更新了我的帖子。请让我知道是否仍然缺少可以更新以满足标准的内容
  • np.ma.masked_equal(a,b) - ab 是什么?
  • 对不起,这是我的错。我忘了用数组和 max_array 替换 a 和 b。我已经更新了我的帖子。

标签: python numpy data-science


【解决方案1】:
import numpy as np
a = np.array([[1,3,3],[6,7,6],[9,9,4]])

首先找到你的最大值

max_array =  a.max(axis=1,keepdims=True)

In [19]: max_array
Out[19]: 
array([[3],
       [7],
       [9]])

然后为所有不是的值创建一个布尔数组

mask = (a != max_array)

In [20]: mask
Out[20]: 
array([[ True, False, False],
       [ True, False,  True],
       [False, False,  True]], dtype=bool)

然后使用掩码过滤左侧上的赋值和右侧上的操作。

a[mask] = a[mask] * 3

In [21]: a
Out[21]: 
array([[ 3,  3,  3],
       [18,  7, 18],
       [ 9,  9, 12]])

Numpy Indexing


与掩码数组相同的过程

b = np.array([[1,3,3],[6,7,6],[9,9,4]])
b_max =  b.max(axis=1,keepdims=True)
b_ma = np.ma.masked_equal(b,b_max)
q = b_ma * 3
b = q.data

# or
b_ma *= 3
b = b_ma.data

这将导致b 成为b_ma 中数据的视图。

In [80]: b.flags['OWNDATA']
Out[80]: False

如果你不想看到 -

In [81]: b = b_ma.data.copy()

In [82]: b.flags['OWNDATA']
Out[82]: True

【讨论】:

    【解决方案2】:

    首先,我更改了语法,以便所有数组和值都匹配 numpy 语法。然后,您创建一个数组“索引”来存储 A 数组具有空值的索引。创建一个作为 A 副本的 C 数组,并使用 np.take 函数将空值填充为 B 值。

    import numpy as np
    A = np.array([ [1, 2, np.nan],
          [4, np.nan, 6],
          [7, 8, np.nan] ])
    B = np.array([ [3],
          [5],
          [9] ,
         ])
    
    indexes = np.where(np.isnan(A))
    
    C = np.copy(A)
    
    C[indexes] = np.take(B, indexes[0])
    
    print(C)
    

    【讨论】:

      【解决方案3】:

      其中一个选项是使用np.nan 而不是--B 的扁平化版本:

      A = np.array([[1, 2, np.nan], [4, np.nan, 6], [7, 8, np.nan]])
      B = np.array([[3], [5], [9]])
      B = B.flatten()
      

      所以B 现在是[3, 5, 9] 的形式。然后您可以使用这些np.nan 识别单元格的位置并重新分配它们:

      x, y = np.nonzero(np.isnan(A))
      A[x,y] = B
      

      输出:

      >>> A
      array([[1., 2., 3.],
             [4., 5., 6.],
             [7., 8., 9.]])
      

      注意:

      • A 的类型是 float,因为在此之前使用了 np.nans
      • 在一维情况下更改np.nonzeronp.where 的替代品
      • 您可能希望改用np.copy(A),以避免A 的动态变化。

      【讨论】:

        猜你喜欢
        • 2015-10-23
        • 2012-11-27
        • 1970-01-01
        • 1970-01-01
        • 2013-06-10
        • 1970-01-01
        • 2021-07-26
        • 1970-01-01
        • 2017-06-06
        相关资源
        最近更新 更多