[英]Fill Numpy Array row wise
我正在试验 Numpy 功能,想知道是否有办法实现所解释的所需行为。 给定一个 numpy 数组,如下所示
array = np.array([[1,3,3],[6,7,6],[9,9,4]])
print(array)
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)
输出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)
输出print(mul_array)
[[3 -- --]
[18 -- 18]
[-- -- 12]]
我想在 mul_array 中的相同位置插入先前被屏蔽的 max_array 中的最大元素,但我找不到任何东西来实现所需的行为。 以下是我的预期矩阵。 我想问一下是否有任何 Numpy 操作来实现所需的行为
期望输出
[[3 3 3]
[18 7 18]
[9 9 12]]
感谢您的帮助!
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]])
与掩码数组相同的过程
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
数据的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
一种选择是使用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
np.nonzero
是替代np.where
在1D情况np.copy(A)
来避免A
动态变化。首先,我更改了语法,以便所有数组和值都匹配 numpy 语法。 然后创建一个数组“索引”来存储索引,其中 A 数组具有空值。 创建一个 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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.