【问题标题】:Assign values to an array based on two other arrays with repeated values基于其他两个具有重复值的数组为数组赋值
【发布时间】:2019-11-13 14:30:08
【问题描述】:

我有一个数组

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

它们是相互关联的。

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

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

由于我想自动绘制与 devID 相关的不同曲线,其长度约为 100,因此我希望从颜色图中分配颜色。

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

【问题讨论】:

  • 确实,np.unique(a, return_inverse=True) 应该可以工作。
  • 确实,它适用于第一部分,但是如何根据device 的值自动为每个不同的位置分配颜色?
  • 您需要一个包含与唯一元素一样多的颜色的数组,并使用从调用np.unique 返回的索引对该数组进行索引。

标签: python numpy matplotlib


【解决方案1】:

正如评论,您可以使用 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.      ]]

【讨论】:

    【解决方案2】:

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

    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

    【讨论】:

    • 太好了,这行得通。但是如何用颜色图替换“rgb”(因为我需要大约 100 种不同的颜色......)
    【解决方案3】:

    更简单的方法是在 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()
    

    【讨论】:

    • 我很想在这种情况下使用 pandas,但恐怕我不能,或者至少我想不出办法。我正在尝试做的图是ab,两者都是包含每个devID 的数百个值的数组。我试图创建一个熊猫数据框,但它太复杂了。但也许有一种简单的方法可以做到这一点......
    • 你可以只用数组 pd.DataFrame({'a' : a, 'b' : b}) 制作一个 pandas 数据框,但这不是必需的。
    • 但是我最终会得到数百个数据帧,每个数据帧对应一个设备......我将如何管理它?而且,我必须对数组 a 和 b 执行一些操作,比如曲线拟合等。我可以用数据框做到这一点吗?
    猜你喜欢
    • 2015-03-31
    • 2013-02-01
    • 2021-02-09
    • 2021-09-29
    • 2020-03-29
    • 2021-11-20
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    相关资源
    最近更新 更多