use*_*839 5 python numpy numpy-ndarray
假设我有一个二维numpy数组,如:
[[1, 8, 3, 4, 5],
[10,13,13,12,15]]
Run Code Online (Sandbox Code Playgroud)
我想将除每行中最大或最大 2 个元素之外的所有元素都转换为零。我想得到的输出是:
[[0, 8, 0,0, 5],
[0,13,13,0,15]]
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
只有一行代码并且没有循环:
a = np.asarray([[1, 8, 3, 4, 5],
[10,13,13,12,15]])
n_max = 2 # second max element
a * (a >= np.sort(a, axis=1)[:,[-n_max]]).astype(int)
Run Code Online (Sandbox Code Playgroud)
输出:
array([[ 0, 8, 0, 0, 5],
[ 0, 13, 13, 0, 15]])
Run Code Online (Sandbox Code Playgroud)
对列做同样的事情...
a = np.asarray([[1, 8, 3, 4, 5],
[10,13,13,12,15],
[6, 9, 12,7, 7],
[3, 8, 5 ,22, 2]])
n_max = 2 # second max element
a * (a >= np.sort(a, axis=0)[[-n_max],:]).astype(int)
Run Code Online (Sandbox Code Playgroud)
输出:
array([[ 0, 0, 0, 0, 0],
[10, 13, 13, 12, 15],
[ 6, 9, 12, 0, 7],
[ 0, 0, 0, 22, 0]])
Run Code Online (Sandbox Code Playgroud)
ham*_*yad -1
为了解决这个问题,我们需要对数据进行排序。如果 x 是您的 numpy 数组数据,首先我们对其进行排序。
import numpy as np
x = np.array([[1,8,3,4,5],[10,13,13,12,15]])
x.sort()
Run Code Online (Sandbox Code Playgroud)
排序后,每行仅两个最终元素显示最大值。因此,我们对另一个元素撒谎为零,并将其保存x在 中f。
for i in range(0,len(x)):
x[i][0:-2]=0
f = x
Run Code Online (Sandbox Code Playgroud)
那么,f就是:
array([[ 0, 0, 0, 5, 8],
[ 0, 0, 0, 13, 15]])
Run Code Online (Sandbox Code Playgroud)
现在我们需要初始x和f:
x = np.array([[1,8,3,4,5],[10,13,13,12,15]])
Run Code Online (Sandbox Code Playgroud)
x是:
array([[ 0, 8, 0, 0, 5],
[ 0, 13, 13, 0, 15]])
Run Code Online (Sandbox Code Playgroud)
最后,我们比较x并f达到我们的目标:
for i in range(0,len(f)):
for j in range(0,len(f[i])):
if x[i][j] not in f[i]:
x[i][j]=0
Run Code Online (Sandbox Code Playgroud)
RESULTforx将是这样的:
array([[ 0, 8, 0, 0, 5],
[ 0, 13, 13, 0, 15]])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1323 次 |
| 最近记录: |