根据其他两个具有重复值的数组将值分配给数组

时间:2019-11-13 14:30:08

标签: python numpy matplotlib

我有一个数组

devID  = [A, B, C, ..., AP, BP, CP, ...]
device = [A, B, C, ..., A,  B,  C, ...]

彼此相关。

我想创建另一个数组color,对于device具有相同值的那些地方,它们具有相同的值,即:

color = [ 'r', 'g', 'b', ..., 'r', 'g', 'b', ...]

由于我想自动绘制与devID相关的不同曲线,该曲线的长度约为100,所以我希望从例如颜色表中分配颜色。

到目前为止,我已经尝试了numpy.uniquenumpy.where的不同组合,但没有成功...

3 个答案:

答案 0 :(得分:2)

如前所述,您可以使用np.unique并使用返回的索引对颜色列表进行索引。

import numpy as np
import matplotlib.pyplot as plt

device = ['A', 'B', 'C', 'A',  'B',  'C']
u, inv = np.unique(device, return_inverse=True)
colors = plt.cm.viridis(np.linspace(0,1,len(u)))[inv]

print(colors)

打印

[[0.267004 0.004874 0.329415 1.      ]
 [0.127568 0.566949 0.550556 1.      ]
 [0.993248 0.906157 0.143936 1.      ]
 [0.267004 0.004874 0.329415 1.      ]
 [0.127568 0.566949 0.550556 1.      ]
 [0.993248 0.906157 0.143936 1.      ]]

答案 1 :(得分:1)

为颜色创建字典并将其映射到设备列表。

In [25]: device = ['A', 'B', 'C', 'A',  'B',  'C']

In [26]: device
Out[26]: ['A', 'B', 'C', 'A', 'B', 'C']

In [27]: colors = dict(zip(np.unique(device), 'rgb'))

In [28]: colors
Out[28]: {'A': 'r', 'B': 'g', 'C': 'b'}

In [29]: color = np.array([colors[dev] for dev in device])

In [30]: color
Out[30]: array(['r', 'g', 'b', 'r', 'g', 'b'], dtype='<U1')

用需要的颜色替换'rgb'。长度必须大于len(np.unique(device))

可以使用

创建N种颜色的列表
import colorsys
N = 5
HSV_tuples = [(x*1.0/N, 0.5, 0.5) for x in range(N)]
RGB_tuples = list(map(lambda x: colorsys.hsv_to_rgb(*x), HSV_tuples))

(来自https://stackoverflow.com/a/876872/10020283

答案 2 :(得分:0)

一种更简单的方法是在 seaborn 软件包的图中使用 hue 选项,此选项根据其参数以不同的颜色绘制元素。例如:

import seaborn as sns

devID  = [1, 2, 3, 1, 2, 3]
device = ['A', 'B', 'C', 'A', 'B', 'C']

sns.scatterplot(devID, devID, hue = device)
plt.show()