明智地填充Numpy Array行

时间:2020-10-04 23:12:28

标签: python numpy data-science

我正在尝试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]]

现在我已经屏蔽了数组,我想对数组中的非max元素执行操作,如乘以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]]

感谢您的帮助!

3 个答案:

答案 0 :(得分: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

这些将导致bb_ma中数据的视图。

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

如果您不想查看-

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

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

答案 1 :(得分:0)

其中一种选择是使用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.nan s
  • 在1D情况下,
  • 更改np.nonzero可以代替np.where
  • 您可能想使用np.copy(A)来避免A的动态变化。

答案 2 :(得分:0)

首先,我更改了语法,以便所有数组和值都与numpy语法匹配。然后,您创建一个数组“索引”来存储索引,其中数组具有空值。创建一个C数组,该数组是A的副本,并使用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)
相关问题