根据字典值和列表创建新矩阵
Creating new matrix based on dictionary values and a list
下面是一个简化的例子:
val = [10,23,45,31,78,43,1,67,82]
indx = [1,4,5,8]
indx2 = [3,6,7]
indx3 = [0,2]
samp = {}
samp[0] = indx
samp[1] = indx2
samp[2] = indx3
假设我有一个字典 (samp),它有两个组:第 0 组和第 1 组。
该字典具有向量 val.
中值的索引
我想通过创建一个 8 X 2 矩阵,根据字典中的给定组提取 val 中的所有值,
我在两列中按索引顺序排列组和值,所以它看起来像这样:
val group
10 2
23 0
45 2
31 0
87 0
43 1
1 1
67 0
82 1
我该怎么做?
使用dictionary comprehension
to reverse the key, value pairs in dictionary and then use map
:
df = pd.DataFrame(val,columns=['val'])
d = {value1:key for key,value in samp.items() for value1 in value}
df['group'] = df.index.map(d)
print(df)
val group
0 10 2
1 23 0
2 45 2
3 31 1
4 78 0
5 43 0
6 1 1
7 67 1
print(d)
{1: 0, 4: 0, 5: 0, 8: 0, 3: 1, 6: 1, 7: 1, 0: 2, 2: 2}
如果值是 numpy 数组怎么办:
indx = np.array([1,4,5,8])
indx2 = np.array([3,6,7])
indx3 = np.array([0,2])
samp = {}
samp[0] = indx
samp[1] = indx2
samp[2] = indx3
print(samp)
{0: array([1, 4, 5, 8]), 1: array([3, 6, 7]), 2: array([0, 2])}
d = {value1:key for key,value in samp.items() for value1 in value}
print(d)
{1: 0, 4: 0, 5: 0, 8: 0, 3: 1, 6: 1, 7: 1, 0: 2, 2: 2}
这是一个不使用 pandas 的解决方案,它输出一个 (8,2) numpy 矩阵:
val = [10,23,45,31,78,43,1,67,82]
indx = [1,4,5,8]
indx2 = [3,6,7]
indx3 = [0,2]
indices = [indx, indx2, indx3]
def get_group(x):
for i,indx_arr in enumerate(indices):
if x in indx_arr:
return i
pairs = [(v,get_group(i)) for i,v in enumerate(val)]
np.asarray(pairs)
array([[10, 2],
[23, 0],
[45, 2],
[31, 1],
[78, 0],
[43, 0],
[ 1, 1],
[67, 1],
[82, 0]])
一种获取方式
[(j, next(k for k,v in samp.items() if i in v)) for i,j in enumerate(val)]
输出:
[(10, 2),
(23, 0),
(45, 2),
(31, 1),
(78, 0),
(43, 0),
(1, 1),
(67, 1),
(82, 0)]
下面是一个简化的例子:
val = [10,23,45,31,78,43,1,67,82]
indx = [1,4,5,8]
indx2 = [3,6,7]
indx3 = [0,2]
samp = {}
samp[0] = indx
samp[1] = indx2
samp[2] = indx3
假设我有一个字典 (samp),它有两个组:第 0 组和第 1 组。 该字典具有向量 val.
中值的索引我想通过创建一个 8 X 2 矩阵,根据字典中的给定组提取 val 中的所有值, 我在两列中按索引顺序排列组和值,所以它看起来像这样:
val group
10 2
23 0
45 2
31 0
87 0
43 1
1 1
67 0
82 1
我该怎么做?
使用dictionary comprehension
to reverse the key, value pairs in dictionary and then use map
:
df = pd.DataFrame(val,columns=['val'])
d = {value1:key for key,value in samp.items() for value1 in value}
df['group'] = df.index.map(d)
print(df)
val group
0 10 2
1 23 0
2 45 2
3 31 1
4 78 0
5 43 0
6 1 1
7 67 1
print(d)
{1: 0, 4: 0, 5: 0, 8: 0, 3: 1, 6: 1, 7: 1, 0: 2, 2: 2}
如果值是 numpy 数组怎么办:
indx = np.array([1,4,5,8])
indx2 = np.array([3,6,7])
indx3 = np.array([0,2])
samp = {}
samp[0] = indx
samp[1] = indx2
samp[2] = indx3
print(samp)
{0: array([1, 4, 5, 8]), 1: array([3, 6, 7]), 2: array([0, 2])}
d = {value1:key for key,value in samp.items() for value1 in value}
print(d)
{1: 0, 4: 0, 5: 0, 8: 0, 3: 1, 6: 1, 7: 1, 0: 2, 2: 2}
这是一个不使用 pandas 的解决方案,它输出一个 (8,2) numpy 矩阵:
val = [10,23,45,31,78,43,1,67,82]
indx = [1,4,5,8]
indx2 = [3,6,7]
indx3 = [0,2]
indices = [indx, indx2, indx3]
def get_group(x):
for i,indx_arr in enumerate(indices):
if x in indx_arr:
return i
pairs = [(v,get_group(i)) for i,v in enumerate(val)]
np.asarray(pairs)
array([[10, 2],
[23, 0],
[45, 2],
[31, 1],
[78, 0],
[43, 0],
[ 1, 1],
[67, 1],
[82, 0]])
一种获取方式
[(j, next(k for k,v in samp.items() if i in v)) for i,j in enumerate(val)]
输出:
[(10, 2),
(23, 0),
(45, 2),
(31, 1),
(78, 0),
(43, 0),
(1, 1),
(67, 1),
(82, 0)]