NumPy更改符合条件的特定行中的元素

时间:2017-12-22 14:16:08

标签: python numpy

所以我有一个矩阵,我想只在某个列上应用条件更改。

示例:

array([[ 0.15293227, -1.50167614, -1.04974543],
       [ 1.25396778,  0.21520081,  0.39136217],
       [-1.1272423 ,  1.18971277,  0.19569736]])

现在如何设置最后一列中大于0到1的所有元素?

3 个答案:

答案 0 :(得分:3)

目前的答案看起来过于复杂。通过组合布尔和'正常'可以更容易地完成它。索引。

In [1]: import numpy as np

In [2]: a = np.array([[ 0.15293227, -1.50167614, -1.04974543],
   ...:               [ 1.25396778,  0.21520081,  0.39136217],
   ...:               [-1.1272423 ,  1.18971277,  0.19569736]])

包含最后一列条件的布尔数组:

In [3]: mask = a[:, -1] > 0.
   ...: mask
Out[3]: array([False,  True,  True], dtype=bool)

现在,使用布尔数组和切片的组合来分配所需的值:

In [4]: a[mask, -1] = 1
   ...: a
   ...: 
Out[4]: 
array([[ 0.15293227, -1.50167614, -1.04974543],
       [ 1.25396778,  0.21520081,  1.        ],
       [-1.1272423 ,  1.18971277,  1.        ]])

有关使用numpy建立索引的更多内容可以找到here

答案 1 :(得分:2)

这是一种方法

In [2]: a[:, -1] = a[:, -1] > 0

In [3]: a
Out[3]: 
array([[ 0.15293227, -1.50167614,  0.        ],
       [ 1.25396778,  0.21520081,  1.        ],
       [-1.1272423 ,  1.18971277,  1.        ]])

如果你不想将负面条目设置为零,这是一个很滑稽的选择:

In [4]: a[:, -1] = a[:, -1] ** (a[:, -1] < 0)

In [5]: a
Out[5]: 
array([[ 0.15293227, -1.50167614, -1.04974543],
       [ 1.25396778,  0.21520081,  1.        ],
       [-1.1272423 ,  1.18971277,  1.        ]])

在回复您的评论时,假设您要设置一个自定义浮动值,以便仅插入正数条目(同时单独留下负数条目)。

In [6]: float_to_insert_at_positives = 3.14159

In [7]: (float_to_insert_at_positives - a[:, -1]) * (a[:, -1] > 0) + a[:, -1]

Out[7]: array([-1.04974543,  3.14159   ,  3.14159   ])

In [8]: a[:, -1] = (float_to_insert_at_positives - a[:, -1]) * (a[:, -1] > 0) + 
... a[:, -1]

In [9]: a
Out[9]: 
array([[ 0.15293227, -1.50167614, -1.04974543],
       [ 1.25396778,  0.21520081,  3.14159   ],
       [-1.1272423 ,  1.18971277,  3.14159   ]])

答案 2 :(得分:1)

你在找这样的东西吗?

import numpy as np
list_1=np.array([[ 0.15293227, -1.50167614, -1.04974543],
       [ 1.25396778,  0.21520081,  0.39136217],
       [-1.1272423 ,  1.18971277,  0.19569736]])

for i in list_1:
    if i[-1:][0]>0:
        i[i.tolist().index(i[-1:])]=1

print(list_1)

输出:

[[ 0.15293227 -1.50167614 -1.04974543]
 [ 1.25396778  0.21520081  1.        ]
 [-1.1272423   1.18971277  1.        ]]
  

只是为了一行中的乐趣,你可以这样做:

[i.__setitem__(i.tolist().index(i[-1:]),1) for i in list_1 if i[-1:][0]>0]

输出:

[[ 0.15293227 -1.50167614 -1.04974543]
 [ 1.25396778  0.21520081  1.        ]
 [-1.1272423   1.18971277  1.        ]]