我有一个看起来像这样的numpy数组:
h = array([string1 1
string2 1
string3 1
string4 3
string5 4
string6 2
string7 2
string8 4
string9 3
string0 2 ])
在第二列中,我想将所有出现次数从1更改为3,将所有出现次数从3更改为2,将所有出现次数从4更改为1
很明显,如果我系统地尝试就地执行此操作,则会出现错误,因为:
h[,:1 == 1] = 3
h[,:1 == 3] = 2
将所有的1更改为2
矩阵的最长长度为50,000个元素,要更改的值可能会变化
我在看类似的问题here,但它会将所有数字都设为0,并且答案是特定的。
是否有一种方法可以同时更改所有这些情况?还是我必须找到另一种方法?
答案 0 :(得分:2)
您可以使用查找表和高级索引:
A = np.rec.fromarrays([np.array("The quick brown fox jumps over the lazy dog .".split()), np.array([1,1,1,3,4,2,2,4,3,2])])
A
# rec.array([('The', 1), ('quick', 1), ('brown', 1), ('fox', 3),
# ('jumps', 4), ('over', 2), ('the', 2), ('lazy', 4), ('dog', 3),
# ('.', 2)],
# dtype=[('f0', '<U5'), ('f1', '<i8')])
LU = np.arange(A['f1'].max()+1)
LU[[1,3,4]] = 3,2,1
A['f1'] = LU[A['f1']]
A
# rec.array([('The', 3), ('quick', 3), ('brown', 3), ('fox', 2),
# ('jumps', 1), ('over', 2), ('the', 2), ('lazy', 1), ('dog', 2),
# ('.', 2)],
# dtype=[('f0', '<U5'), ('f1', '<i8')])
答案 1 :(得分:1)
最好的方法是使用字典来映射值。这样做需要您使用向量化函数:
Dim FILEPATH As String = ("D:/try/2019/" & id & "/")
HyperLink1.NavigateUrl = FILEPATH
答案 2 :(得分:1)
您可以直接使用map
,也可以使用效率更高的numpy.vectorize
将映射函数转换为可以直接应用于数组的函数:
import numpy as np
mapping = {
1: 3,
3: 4,
4: 1
}
a = np.array([1, 2, 3, 4, 5, 1, 2, 3, 4, 5])
mapping_func = np.vectorize(lambda x: mapping[x] if x in mapping else x)
b = mapping_func(a)
print(a)
print(b)
结果:
[1 2 3 4 5 1 2 3 4 5]
[3 2 4 1 5 3 2 4 1 5]
请注意,您不必使用dict
或lambda
函数。您可以使用将源数组的数据类型作为输入(在这种情况下为int
并返回目标数组的数据类型的任何普通函数。