我很惊讶这个问题还没有被问到。给定一个整数数组
x = np.random.randint(1,4,10)
> array([3, 2, 1, 2, 1, 1, 3, 3, 2, 1])
如何(轻松)根据某些系统规则更改所有值,例如
x[x==1] = 5
x[x==2] = 6
x[x==3] = 7
> array([6, 5, 6, 7, 5, 5, 6, 5, 7, 6])
规则可能比这更复杂,例如重新编码1=2
和2=1
,以便订单发挥作用。
答案 0 :(得分:2)
虽然其他人可能建议只是使用字典,但我建议使用实际针对此特定行为类型的内容,而不是手动使用字典Python's map
函数
map
接受一个函数并将其应用于每个输入,并将其结果作为列表返回。因此,您可以将if x == y, return z
创建为函数并将map(yourfunction, yourlist)
应用于该函数。
好thing about map
是你可以在任何可迭代的,而不仅仅是你的列表上使用它
普通python版
def numberfunc(x):
if x == 1:
return 5
elif x == 2:
return 6
elif x== 3:
return 7
else:
return x
x = [random.randint(1,4) for _ in range(10)]
# array([3, 2, 1, 2, 1, 1, 3, 3, 2, 1])
x = map(numberfunc, x)
# array([6, 5, 6, 7, 5, 5, 6, 5, 7, 6])
Numpy版本(numpy使用vectorize
作为其map
)
x = np.random.randint(1,4,10)
# array([3, 2, 1, 2, 1, 1, 3, 3, 2, 1])
x = x.vectorize(numberfunc)
# array([6, 5, 6, 7, 5, 5, 6, 5, 7, 6])
此外,如果您的数字地图功能进行了大量的比较(大于此处列出的3),您可以考虑使用python的dict
以提高O(1) armortized元素访问时间的性能,例如:
num_dict {1:5, 2:6, 3:7, ...}
def numberfunc(x):
if x in num_dict:
return num_dict[x]
return x
您可能不希望在简单的情况下执行此操作,因为 armortized 了解字典运行时性能和持续开销。 Amortized基本上意味着考虑到您将进行的所有操作,最昂贵的操作的成本将被较便宜的廉价的成本所抵消。字典突变偶尔会很昂贵;从整体上看,与其他数据结构相比,许多字典突变并不昂贵。与数组相比,字典也有更大的索引开销。在一个简单的实现中,you will typically have to iterate over lists given your key to find your value以及更复杂的情况often more guaranteed overhead is involved
答案 1 :(得分:1)
最直接的方法就是迭代数组替换值。
rule = {1: 5, 2: 6, 3: 7}
x = x.vectorize(lambda x: rule[x] if x in rule else x)
答案 2 :(得分:1)
使用map
进行转换。 map
采用转换函数和输入列表,并输出将该函数系统地应用于所有输入的结果。
例如:
def mapping(i):
if i == 1:
return 5
elif i == 2:
return 6
elif i == 3:
return 7
return i
print array(map(mapping, [3, 2, 1, 2, 1, 1, 3, 3, 2, 1]))