[引用数组的多个值时,使用Python列表理解排除重复项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[引用数组的多个值时,使用Python列表理解排除重复项相关的知识,希望对你有一定的参考价值。

任务是返回2D数据集的每一行,该行的条目的值大于其所属列的值。

我正在尝试是否有一种更聪明的方法来实现列表理解:

data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15], [86, 4, 14]])
sliced = [data[i] for i in range(len(data))
            for j in range(len(data[i]))
                if data[i,j] > np.mean(data[:,j])]

此代码返回:

[array([7, 8, 9]), array([10, 11, 12]), array([10, 11, 12]), array([13, 14, 15]), array([13, 14, 15]), array([86,  4, 14]), array([86,  4, 14])]

[您可以看到它完成了任务,但是它在[10,11,12]之类的行中保留了重复项,其中值11和12都大于其列的平均值。

在列表理解期间是否有一种聪明的方法可以从同一行中排除其他数据点?我可以在以后删除重复项,但是在一个假设的上下文中,可能会删除碰巧相同的有效数据。

答案
In [45]: data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14
    ...: , 15], [86, 4, 14]])                                                   
In [46]: data                                                                   
Out[46]: 
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12],
       [13, 14, 15],
       [86,  4, 14]])

In [49]: [data[i] for i in range(len(data)) 
    ...:             for j in range(len(data[i])) 
    ...:                 if data[i,j] > np.mean(data[:,j])]                     
Out[49]: 
[array([7, 8, 9]),
 array([10, 11, 12]),
 array([10, 11, 12]),
 array([13, 14, 15]),
 array([13, 14, 15]),
 array([86,  4, 14]),
 array([86,  4, 14])]

我打算正确理解列表,但随后意识到从麻木的角度来看,这更容易实现:

In [55]: m = data.mean(axis=0)                                                  
In [56]: m                                                                      
Out[56]: array([20.16666667,  7.33333333,  9.83333333])
In [57]: data>m                                                                 
Out[57]: 
array([[False, False, False],
       [False, False, False],
       [False,  True, False],
       [False,  True,  True],
       [False,  True,  True],
       [ True, False,  True]])
In [58]: np.any(data>m, axis=1)                                                 
Out[58]: array([False, False,  True,  True,  True,  True])
In [59]: data[_,:]                                                              
Out[59]: 
array([[ 7,  8,  9],
       [10, 11, 12],
       [13, 14, 15],
       [86,  4, 14]])

列表理解版本:

In [64]: [row for row in data if any(row > m)]                                  
Out[64]: 
[array([7, 8, 9]),
 array([10, 11, 12]),
 array([13, 14, 15]),
 array([86,  4, 14])]

尽管仍然使用numpy row>m测试。纯列表方法的困难在于,您的期望均值已从各列中扣除。

[row for row in data ... if ... mean(row)]

无效,因为这是错误的尺寸;我们想要mean(col)还是您想要的data[:,j]

以上是关于[引用数组的多个值时,使用Python列表理解排除重复项的主要内容,如果未能解决你的问题,请参考以下文章

如何理解Python中的容器对象

Python Basic - 列表(数组)(List)的使用方法

Python:描述符列表

在Python中分配多个值时的奇怪问题[重复]

C# DateTime OrderBy 当列表包含一些相同的 DateTime 值时

列表理解中的双重迭代