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