Python中的元素排列

时间:2015-06-08 08:37:26

标签: python numpy

数组“data”的每个元素都必须按如下方式进行更改:

例如, 应该在names_A和data_A中看到4。 4的names_A是'David'。 现在应该在names_B和data_B中看到'David'。 'David'的data_B是30。 因此,元素4必须改变30;等等。

import numpy as np

names_A = ['David', 'Mark', 'Brian', 'Michael']
data_A = [4,3,1,2]

names_B = ['Mark', 'David', 'Michael', 'Brian']
data_B = [51,30,11,29]

data = np.array([[4,4,3,3,2,2,1,1,3,3],
                [4,3,3,3,2,2,3,1,3,1],
                [4,2,3,3,2,2,4,1,4,3]])

最简单,最简单的方法是什么?

我尝试了如下:

dats = data.ravel()

results = []
for d in dats:
    nam_A = names_A[data_A == int(d)]
    dat_B = data_B[names_B == nam_A]
    results.append(dat_B)

print np.array(results).reshape(data.shape)


[[51 51 51 51 51 51 51 51 51 51]
 [51 51 51 51 51 51 51 51 51 51]
 [51 51 51 51 51 51 51 51 51 51]]

但是,它给出了错误的结果。你会怎么做?

1 个答案:

答案 0 :(得分:1)

使用词典创建映射。

names_A = ['David', 'Mark', 'Brian', 'Michael']
data_A = [4,3,1,2]

names_B = ['Mark', 'David', 'Michael', 'Brian']
data_B = [51,30,11,29]

lookup_a = dict(zip(names_A, data_A))
lookup_b = dict(zip(names_B, data_B))

mapping = {value_a: lookup_b[key_a] for key_a, value_a in lookup_a.items()}

现在mapping中的键将是data_A中的数字,其中包含来自data_B的相应值。

我从未与numpy合作过,但现在替换它似乎很容易。

举一个简单列表的例子:

data = [4, 4, 3, 3, 2, 2, 1, 1, 3, 3]
data = [mapping[value] for value in data]

data现在是[30, 30, 51, 51, 11, 11, 29, 29, 51, 51]

安装numpy

后编辑

如果您创建了映射字典,则可以执行以下操作:

data = np.array([[4, 4, 3, 3, 2, 2, 1, 1, 3, 3],
                 [4, 3, 3, 3, 2, 2, 3, 1, 3, 1],
                 [4, 2, 3, 3, 2, 2, 4, 1, 4, 3]])

for row in data:
    for index, value in enumerate(row):
        row[index] = mapping[value]

data现在是:

[[32 30 51 51 11 11 29 29 51 51]
 [30 51 51 51 11 11 51 29 51 29]
 [30 11 51 51 11 11 30 29 30 51]]

因为我之前从未使用numpy可能会有更容易(或更多pythonic)的解决方案,但至少这可以做它应该做的事情。