Python 查找并替换二维数组中的特定值
我有一个大的2D数组,Python 查找并替换二维数组中的特定值,python,python-3.x,multidimensional-array,Python,Python 3.x,Multidimensional Array,我有一个大的2D数组,数组,每个条目都是一个大的数字数组 : 2D数组中的所有数字都是0-5,我必须以某种方式找到并替换特定的数字,例如,所有出现的数字3,并替换为5 谢谢 这应该行得通 如果您有一个名为Arr的数组,那么这对于单个值应该有效,例如: Arr = np.array([[1,2,3], [1,2,3], [1,2,3]]) 然后: 给出: mask = np.array([[False,True,False],
数组
,每个条目都是一个大的数字数组
:
2D数组中的所有数字都是0-5,我必须以某种方式找到并替换特定的数字,例如,所有出现的数字3
,并替换为5
谢谢
这应该行得通
如果您有一个名为Arr的数组,那么这对于单个值应该有效,例如:
Arr = np.array([[1,2,3],
[1,2,3],
[1,2,3]])
然后:
给出:
mask = np.array([[False,True,False],
[False,True,False],
[False,True,False]])
Arr = np.array([[1,4,3],
[1,4,3],
[1,4,3]])
最后,将2替换为4:
newArr[mask] = 4
给出:
mask = np.array([[False,True,False],
[False,True,False],
[False,True,False]])
Arr = np.array([[1,4,3],
[1,4,3],
[1,4,3]])
对于单个值,假设您有一个名为Arr的数组,那么:
Arr = np.array([[1,2,3],
[1,2,3],
[1,2,3]])
然后:
给出:
mask = np.array([[False,True,False],
[False,True,False],
[False,True,False]])
Arr = np.array([[1,4,3],
[1,4,3],
[1,4,3]])
最后,将2替换为4:
newArr[mask] = 4
给出:
mask = np.array([[False,True,False],
[False,True,False],
[False,True,False]])
Arr = np.array([[1,4,3],
[1,4,3],
[1,4,3]])
这可以用一行简单的列表理解来完成 假设您有一个列表:
a = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
您希望将所有出现的2
替换为4
:
[[_el if _el != 2 else 4 for _el in _ar] for _ar in a]
import numpy as np
a = np.array([[1, 2, 3],
[1, 2, 3],
[1, 2, 3]])
np.where(a==2, 4, a)
另一个选项是使用numpy的函数。从文档字符串:
其中(条件[x,y])
根据条件
,从x
或y
返回元素
因此,在您的情况下(假设您想再次将所有2
替换为4
):
如果要一次性替换多个值,可以执行以下操作:
假设您要将1
替换为3
,将3
替换为5
:
ix=np.isin(array, [1,3])
vc=np.vectorize(lambda x: 3 if x == 1 else 5)
np.where(ix, vc(array), array)
如果有两个以上的值要替换,假设您想将列表映射到[1,3,5]
到[3,5,-3]
,那么您可以定义一个简单的函数,如:
old_vals = [1,3,5]
new_vals = [3, 5, -3]
def switch_val(x):
return new_vals[old_vals.index(x)] if x in old_vals else x
因此:
vc=np.vectorize(switch_val)
vc(array)
在这里我们可以看到函数
希望对大家有帮助,编码快乐 这可以通过一行简单的列表理解来完成 假设您有一个列表:
a = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
您希望将所有出现的2
替换为4
:
[[_el if _el != 2 else 4 for _el in _ar] for _ar in a]
import numpy as np
a = np.array([[1, 2, 3],
[1, 2, 3],
[1, 2, 3]])
np.where(a==2, 4, a)
另一个选项是使用numpy的函数。从文档字符串:
其中(条件[x,y])
根据条件
,从x
或y
返回元素
因此,在您的情况下(假设您想再次将所有2
替换为4
):
如果要一次性替换多个值,可以执行以下操作:
假设您要将1
替换为3
,将3
替换为5
:
ix=np.isin(array, [1,3])
vc=np.vectorize(lambda x: 3 if x == 1 else 5)
np.where(ix, vc(array), array)
如果有两个以上的值要替换,假设您想将列表映射到[1,3,5]
到[3,5,-3]
,那么您可以定义一个简单的函数,如:
old_vals = [1,3,5]
new_vals = [3, 5, -3]
def switch_val(x):
return new_vals[old_vals.index(x)] if x in old_vals else x
因此:
vc=np.vectorize(switch_val)
vc(array)
在这里我们可以看到函数
希望对大家有帮助,编码快乐 您能否提供一个?正如您所说的“特定号码”,您搜索的号码超过1个是否正确?你知道这些数字是什么吗?是的,数组中唯一的数字是从0到5,所以我必须用-5替换1,用-3替换2,用1替换3,用3替换4,用5替换5。这个问题的可能重复对我来说似乎并不清楚。你能提供一个吗?正如你所说的“特定数字”,你搜索的不止一个数字正确吗?你知道这些数字是什么吗?是的,数组中唯一的数字是0-5,所以我必须用-5替换1,用-3替换2,用1替换3,用3替换4,用5替换5。这个问题的可能重复对我来说似乎不清楚。谢谢,我尝试了这个表单,但由于某些原因它没有工作,它只是为范围内的i(len(new_set)):为范围内的j(len(new_set[i]):如果new_set[i][j]==1:new_set[i][j]=-5打印(new_set)谢谢,我尝试了这个表单,但由于某种原因它没有工作,它只是为范围内的i(len(new_set))打印了完全相同的数组:为范围内的j(len(new_set[i]):如果new_set[i][j]==1:new_set[i][j]=-5打印(新设置)很奇怪,鉴于OP想要替换多个值,我想最具python风格的方法应该是使用np.where多次…?而不是使用一堆条件和/或elifs?@NathanThomas对hick黑客很抱歉。我把它添加到了答案中。:)我很好奇,但结果非常优雅。很高兴看到完整的工作示例供将来使用@非常欢迎你!奇怪的是,考虑到OP想要替换多个值,我想最具python风格的方法应该是使用np.where多次。。。?“而不是使用一堆条件和/或elifs?”NathanThomas对hick黑客表示抱歉。我把它添加到了答案中。:)我只是好奇,但结果却很优雅。很高兴看到完整的工作示例供将来使用@非常欢迎你!