Python 如何在numpy数组中应用数组作为值的字典
我正试图绘制这本词典Python 如何在numpy数组中应用数组作为值的字典,python,numpy,dictionary,Python,Numpy,Dictionary,我正试图绘制这本词典 dict = { 5: np.array([1,1,1,1,1], dtype='int'), 4: np.array([1,1,1,1,0], dtype='int'), 3: np.array([1,1,1,0,0], dtype='int'), 2: np.array([1,1,0,0,0], dtype='int'), 1: np.array([1,0,0,0,0], dtype='int'), 0: np.array([0,0,0,0,0], dtype='int
dict = {
5: np.array([1,1,1,1,1], dtype='int'),
4: np.array([1,1,1,1,0], dtype='int'),
3: np.array([1,1,1,0,0], dtype='int'),
2: np.array([1,1,0,0,0], dtype='int'),
1: np.array([1,0,0,0,0], dtype='int'),
0: np.array([0,0,0,0,0], dtype='int'),
-1: np.array([-1,0,0,0,0], dtype='int'),
-2: np.array([-1,-1,0,0,0], dtype='int'),
-3: np.array([-1,-1,-1,0,0], dtype='int'),
-4: np.array([-1,-1,-1,-1,0], dtype='int'),
-5: np.array([-1,-1,-1,-1,-1], dtype='int')}
在这个numpy数组中
target
array([[ 2, 0, 2, 0, 0, 3, 0, 0, 1, 0, 0, -2, 4, -2, 0, 0,
-3, -3, -5, 1, 0, 0, 0, 2],
[ 4, 4, 3, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
1, -1, -2, -1, -2, -2, -3, -4],...])
numpy数组上的元素是int32。如何映射此值?您可以尝试在
目标
数组上迭代,并使用所需值创建一个新列表,如果需要,稍后可以将其转换为数组
可能是这样的:
new_target = []
for e in target:
new_target.append(the_dict[e])
new_target = np.array(new_target)
编辑:如果需要的尺寸大于1,则可以选择第二个循环
import numpy as np
my_dict = {
5: np.array([ 1, 1, 1, 1, 1], dtype='int'),
4: np.array([ 1, 1, 1, 1, 0], dtype='int'),
3: np.array([ 1, 1, 1, 0, 0], dtype='int'),
2: np.array([ 1, 1, 0, 0, 0], dtype='int'),
1: np.array([ 1, 0, 0, 0, 0], dtype='int'),
0: np.array([ 0, 0, 0, 0, 0], dtype='int'),
-1: np.array([-1, 0, 0, 0, 0], dtype='int'),
-2: np.array([-1,-1, 0, 0, 0], dtype='int'),
-3: np.array([-1,-1,-1, 0, 0], dtype='int'),
-4: np.array([-1,-1,-1,-1, 0], dtype='int'),
-5: np.array([-1,-1,-1,-1,-1], dtype='int'),
}
target = np.array([
[ 2, 0, 2, 0, 0, 3, 0, 0, 1, 0,
0, -2, 4, -2, 0, 0, -3, -3, -5, 1,
0, 0, 0, 2],
[ 4, 4, 3, 2, 0, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 1, -1, -2, -1,
-2, -2, -3, -4],
])
new_target = []
for num_list in target:
sub_new_target = []
print(num_list)
for n in num_list:
sub_new_target.append(my_dict[n])
new_target.append(sub_new_target)
new_target = np.array(new_target)
print(target.shape)
print(target)
print(new_target.shape)
print(new_target)
您可以简单地使用嵌套列表:
[[mydict[j] for j in i] for i in target]
这将产生:
[[array([1, 1, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([1, 1, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([1, 1, 1, 0, 0]), array([0, 0, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([1, 0, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([-1, -1, 0, 0, 0]), array([1, 1, 1, 1, 0]), array([-1, -1, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([-1, -1, -1, 0, 0]), array([-1, -1, -1, 0, 0]), array([-1, -1, -1, -1, -1]), array([1, 0, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([1, 1, 0, 0, 0])], [array([1, 1, 1, 1, 0]), array([1, 1, 1, 1, 0]), array([1, 1, 1, 0, 0]), array([1, 1, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([1, 0, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([0, 0, 0, 0, 0]), array([1, 0, 0, 0, 0]), array([-1, 0, 0, 0, 0]), array([-1, -1, 0, 0, 0]), array([-1, 0, 0, 0, 0]), array([-1, -1, 0, 0, 0]), array([-1, -1, 0, 0, 0]), array([-1, -1, -1, 0, 0]), array([-1, -1, -1, -1, 0])]]
另一方面,避免使用
dict
作为变量名,因为它会覆盖dict
Python内置名。您可以使用列表理解和馈送到np.array
:
res = np.array([list(map(d.__getitem__, row)) for row in target])
array([[[ 1, 1, 0, 0, 0],
[ 0, 0, 0, 0, 0],
[ 1, 1, 0, 0, 0],
...
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0],
[ 1, 1, 0, 0, 0]],
[[ 1, 1, 1, 1, 0],
[ 1, 1, 1, 1, 0],
[ 1, 1, 1, 0, 0],
...
[-1, -1, 0, 0, 0],
[-1, -1, -1, 0, 0],
[-1, -1, -1, -1, 0]]])
注意:字典已重命名为
d
:不要对内置项进行阴影处理。由于字典中的键是连续的,我建议在此处使用数组以提高性能,创建这样一个数组的模式非常简单:
mapper = np.stack([i[1] for i in sorted(d.items())])
现在您只需稍微更新索引。这里的总体思路是,如果当前有一个键与字典中的值匹配,那么现在应该有一个值与映射器数组中的行索引匹配。在处理大型数组时,这将是一个比使用字典性能更好的选项: 对于您当前的数组,这只需要将每个值增加5,现在您已经矢量化了索引:
mapper[target+5]
计时
即使从字典中创建一个数组的开销很小,我们还是希望在
(20000,24)
形状数组上实现35倍的加速。您能解释一下吗!!不明白你想要什么!!我想在这个numpy数组上应用这个字典。所以,第一行的numpy数组[2,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,2,4,-2,0,0,-3,-3,-3,-3,-5,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2]的第一行的第一行,1,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[1,0,0],[1,1,1,0],-1,-1,0,0,0],[0,0,0,0],[0,0,0,0,0], [-1,-1,-1,0,0], [-1,-1,-1,0,0], [-1,-1,-1,-1,-1], [1,0,0,0,0], [0,0,0,0,0], [0,0,0,0,0], [0,0,0,0,0], [1,1,0,0,0] ]这会抛出TypeError:unhabable type:'numpy.ndarray'
@rahlf23这是因为这个答案假设target
是一个一维数组。对于二维数组,这会传递一个列表来查找字典,这会产生问题。我现在看到@Ralf在他的答案的后半部分澄清了这一点。你的方法给我一个sh(240,5)的猿(使用10-dim)我需要类似(10,24,5)的东西,这就是我想要的!谢谢!
mapper[target+5]
array([[[ 1., 1., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 1., 1., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
...
[ 0., 0., 0., 0., 0.],
[ 1., 1., 0., 0., 0.]],
[[ 1., 1., 1., 1., 0.],
[ 1., 1., 1., 1., 0.],
[ 1., 1., 1., 0., 0.],
[ 1., 1., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
...
[-1., -1., 0., 0., 0.],
[-1., 0., 0., 0., 0.]]])
big_target = np.repeat(target, 10000, axis=0)
In [307]: %%timeit
...: mapper = np.stack([i[1] for i in sorted(d.items())])
...: mapper[big_target+5]
...:
10.5 ms ± 54.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [309]: %%timeit
...: np.array([list(map(d.__getitem__, row)) for row in big_target])
...:
368 ms ± 1.31 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [311]: %timeit np.array([[d[j] for j in i] for i in big_target])
361 ms ± 4.35 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)