Python NumPy更改特定行中与条件匹配的元素

Python NumPy更改特定行中与条件匹配的元素,python,numpy,Python,Numpy,所以我有一个矩阵,我只想对某一列应用条件更改 例如: array([[ 0.15293227, -1.50167614, -1.04974543], [ 1.25396778, 0.21520081, 0.39136217], [-1.1272423 , 1.18971277, 0.19569736]]) 现在,如何将最后一列中大于0的所有元素设置为1?这里有一种方法 In [2]: a[:, -1] = a[:, -1] > 0 In [3]: a

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

例如:

array([[ 0.15293227, -1.50167614, -1.04974543],
       [ 1.25396778,  0.21520081,  0.39136217],
       [-1.1272423 ,  1.18971277,  0.19569736]])
现在,如何将最后一列中大于0的所有元素设置为1?

这里有一种方法

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 [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.        ]])

你在找这样的东西吗

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.        ]]
[[ 0.15293227 -1.50167614 -1.04974543]
 [ 1.25396778  0.21520081  1.        ]
 [-1.1272423   1.18971277  1.        ]]
为了好玩,你可以这样做:

输出:

[[ 0.15293227 -1.50167614 -1.04974543]
 [ 1.25396778  0.21520081  1.        ]
 [-1.1272423   1.18971277  1.        ]]
[[ 0.15293227 -1.50167614 -1.04974543]
 [ 1.25396778  0.21520081  1.        ]
 [-1.1272423   1.18971277  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.        ]]
[[ 0.15293227 -1.50167614 -1.04974543]
 [ 1.25396778  0.21520081  1.        ]
 [-1.1272423   1.18971277  1.        ]]
为了好玩,你可以这样做:

输出:

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

目前的答案看起来过于复杂。通过将布尔索引和“普通”索引相结合,可以更轻松地实现这一点

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索引的更多信息,请参见。

当前的答案看起来过于复杂。通过将布尔索引和“普通”索引相结合,可以更轻松地实现这一点

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索引的更多信息。

**
运算符的左侧参数是numpy
ndarray
时,则
**
意味着将左侧数组的每个元素提升到右侧数组的对应元素给定的幂(或者,如果只给出标量指数值,则将所有值提高到相同的幂次)。在常规Python中,
**
表示数值类型的求幂。
2**3
是两个立方。啊,我明白了。因此,只有当我希望将它们设置为1时,第二种方法才会起作用,因为
x**0==1
。是否有任何方法可以将它们设置为任何其他浮点值?我添加了该情况作为最后一个示例。完美。我花了一点时间来完成弄清楚它是如何工作的。谢谢。在你的解决方案的基础上,我发现这稍微更直观一些
(ar[:,-1]>0)*num+(ar[:,-1]是的,这可能更可读,但代价是做两次矢量化的乘法,而不是一次(这在大多数情况下可能并不重要)。当
**
运算符的左侧参数是NumPy
ndarray
时,则
**
表示将左侧数组的每个元素提升到右侧数组的相应元素给定的幂次(或者,如果只给出标量指数值,则将所有元素提升到相同的幂次)。在常规Python中,
**
表示数值类型的求幂。
2**3
是两个立方。啊,我明白了。因此,只有当我希望将它们设置为1时,第二种方法才会起作用,因为
x**0==1
。是否有任何方法可以将它们设置为任何其他浮点值?我添加了该情况作为最后一个示例。完美。我花了一点时间来完成弄清楚它是如何工作的。谢谢。在你的解决方案的基础上,我发现这稍微更直观一些
(ar[:,-1]>0)*num+(ar[:,-1]是的,这可能更可读,但代价是做两次矢量化的乘法,而不是一次(这在大多数情况下可能并不重要).哇哦,老兄。列表理解应该让核心更可读和更容易理解……事实并非如此。在那里看一眼并不总是让事情变得更好。无论如何,谢谢!我喜欢第一个解决方案。哇,老兄。列表理解应该让核心更可读和更容易理解……事实并非如此。在那里看一眼确实如此不是总能让事情变得更好。无论如何,谢谢!不过我喜欢第一个解决方案。