Python 在两个数组上迭代,查找dict中的值
所以我有一本字典:Python 在两个数组上迭代,查找dict中的值,python,arrays,numpy,dictionary,vectorization,Python,Arrays,Numpy,Dictionary,Vectorization,所以我有一本字典: LCM_SCS = { (1, "A"): 36, (1, "B"): 60, (1, "C"): 73, (1, "D"): 79, (2, "A"): 36, (2, "B"): 60, (2, "C"): 73, (2, "D"): 79, (3, "A"): 74, (3, "B"): 83, (3, "C"): 88, (3, "D"): 90, (4, "A"): 68, (4, "B"):
LCM_SCS = {
(1, "A"): 36, (1, "B"): 60, (1, "C"): 73, (1, "D"): 79,
(2, "A"): 36, (2, "B"): 60, (2, "C"): 73, (2, "D"): 79,
(3, "A"): 74, (3, "B"): 83, (3, "C"): 88, (3, "D"): 90,
(4, "A"): 68, (4, "B"): 79, (4, "C"): 86, (4, "D"): 89,
(5, "A"): 30, (5, "B"): 58, (5, "C"): 71, (5, "D"): 78,
(6, "A"): 39, (6, "B"): 61, (6, "C"): 74, (6, "D"): 80,
(7, "A"): 39, (7, "B"): 61, (7, "C"): 74, (7, "D"): 80,
(8, "A"): 39, (8, "B"): 61, (8, "C"): 74, (8, "D"): 80,
(10, "A"): 30, (10, "B"): 48, (10, "C"): 65, (10, "D"): 73,
我还有两个数组,它们组合在一起为我的字典提供了元组键:
阵列1:
array1 = np.array([[1, 1, 1],
[2, 2, 3],
[2, 4, 5]])
阵列2:
array2 = np.array([["A", "A", "A"],
["B", "B", "B"],
["C", "C", "C"]])
我的代码是:
Numbers = np.empty_like(array1)
for [x, y], (value1, value2) in np.ndenumerate(izip(array1, array2)):
CN_numbers[x, y] = LCM_SCS.get((value1, value2))
return Numbers
这个代码不起作用。我想要得到的是一个如下所示的数组:
Numbers = array([[36, 36, 36],
[60, 60, 83],
[73, 86, 71]])
因此,本质上我有两个数组,其中包含用作查找dict键的值,我不确定如何在代码中实现这一点
如有任何建议或帮助,将不胜感激
谢谢
尼克
使用矢量化的解决方案:
a_new = np.empty_like(array1)
def get_CN_numbers(a1, a2):
return LCM_SCS[(a1, a2)] # your basic scalar-operation
V_get_CN = np.vectorize(get_CN_numbers)
a_new = V_get_CN(array1, array2)
print a_new
输出:
[36, 36, 36, 60, 60, 83, 73, 86, 71]
您可以根据需要将其转换为列表列表,甚至可以将其设置为np.array()
尝试以下操作:
>>> new_array = np.rec.fromarrays((array1,array2),names='x,y') # This will generate all keys that you'll look value for.
>>> print new_array
[[(1, 'A') (1, 'A') (1, 'A')]
[(2, 'B') (2, 'B') (3, 'B')]
[(2, 'C') (4, 'C') (5, 'C')]]
>>> result = np.zeros([3,3],dtype=int) #Having issue to modify directly on new_array so I initialized a new numpy array to store result
>>> for (x,y), value in np.ndenumerate(new_array):
result[x][y] = LCM_SCS[tuple(value)]
>>> print result
[[36 36 36]
[60 60 83]
[73 86 71]]
它
通常,使用vectorize
是扩展标量操作(在您的示例中,通过标量键从dict获取值)以处理数组(在您的示例中,两个键数组)的一种简单方法。正如您已经发现的那样,vectorize
为您处理的棘手部分是保持形状
这提供了简单性,但不一定是速度,因为
vectorize
是使用python空间循环实现的。谢谢,但您的结果生成的输出不是我想要的。我想用字典中的新值来保持数组的形状。嗨,这听起来是一个非常简单的解决方案,但我似乎无法让它工作。我得到了错误:“TypeError:unhabable type:'numpy.ndarray'”谢谢!这将使我以后不得不做的事情变得更容易。
>>> new_array = np.rec.fromarrays((array1,array2),names='x,y') # This will generate all keys that you'll look value for.
>>> print new_array
[[(1, 'A') (1, 'A') (1, 'A')]
[(2, 'B') (2, 'B') (3, 'B')]
[(2, 'C') (4, 'C') (5, 'C')]]
>>> result = np.zeros([3,3],dtype=int) #Having issue to modify directly on new_array so I initialized a new numpy array to store result
>>> for (x,y), value in np.ndenumerate(new_array):
result[x][y] = LCM_SCS[tuple(value)]
>>> print result
[[36 36 36]
[60 60 83]
[73 86 71]]
@numpy.vectorize
def get_CN_numbers(a1, a2):
return LCM_SCS[(a1,a2)] # your basic scalar-operation
get_CN_numbers(array1, array2)
=>
array([[36, 36, 36],
[60, 60, 83],
[73, 86, 71]])