如何解决根据键翻译numpy数组中的每个元素
我不知道效率如何,但是您可以使用字典np.vectorize
的.get
方法:
>>> a = np.array([[1,2,3],
[3,2,4]])
>>> my_dict = {1:23, 2:34, 3:36, 4:45}
>>> np.vectorize(my_dict.get)(a)
array([[23, 34, 36],
[36, 34, 45]])
解决方法
我试图numpy.array
根据给定的键转换a的每个元素:
例如:
a = np.array([[1,2,3],[3,4]])
my_dict = {1:23,2:34,3:36,4:45}
我想得到:
array([[ 23.,34.,36.],[ 36.,45.]])
我可以看到如何使用循环:
def loop_translate(a,my_dict):
new_a = np.empty(a.shape)
for i,row in enumerate(a):
new_a[i,:] = map(my_dict.get,row)
return new_a
有没有更有效和/或纯粹的numpy方法?
编辑:
我计时了一下,np.vectorize
DSM提出的方法对于较大的阵列要快得多:
In [13]: def loop_translate(a,my_dict):
....: new_a = np.empty(a.shape)
....: for i,row in enumerate(a):
....: new_a[i,row)
....: return new_a
....:
In [14]: def vec_translate(a,my_dict):
....: return np.vectorize(my_dict.__getitem__)(a)
....:
In [15]: a = np.random.randint(1,5,(4,5))
In [16]: a
Out[16]:
array([[2,4,3,1,1],[2,4],[4,1]])
In [17]: %timeit loop_translate(a,my_dict)
10000 loops,best of 3: 77.9 us per loop
In [18]: %timeit vec_translate(a,best of 3: 70.5 us per loop
In [19]: a = np.random.randint(1,(500,500))
In [20]: %timeit loop_translate(a,my_dict)
1 loops,best of 3: 298 ms per loop
In [21]: %timeit vec_translate(a,my_dict)
10 loops,best of 3: 37.6 ms per loop
In [22]: %timeit loop_translate(a,my_dict)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。