在键

时间:2018-12-03 00:32:56

标签: python numpy

我正在一个机器学习项目中,该项目将数据分类为numpy数组。第一列是标签,第二列是特征及其值的字典,因为作为一个完整的矩阵,它非常稀疏,并且有大量特征和示例。

我发现使用以下方法从我的数据集中获取行的子集非常简单:

dataset[dataset[:, 0] == 1]

,这将返回标签为1的所有行的numpy数组。我想要做的事情是这样的(此示例不起作用):

dataset[2 in dataset[:, 1]]

,它返回字典中以2为键的所有行的numpy数组。更为有用的是一种对键值对进行过滤的方法(此当前设置是所有二进制功能,但是我还有其他具有多种可能性的项目)。

我正在使用python 3.6。 预先感谢您的帮助!

以下是我要解析的数据示例:

[1 {10: 1, 12: 1, 15: 1, 18: 1, 31: 1, 36: 1, 48: 1, 59: 1, 70: 1, 79: 1, 90: 1, 100: 1, 125: 1, 140: 1, 163: 1, 185: 1, 200: 1}]
[1 {9: 1, 11: 1, 14: 1, 18: 1, 29: 1, 36: 1, 48: 1, 59: 1, 68: 1, 79: 1, 89: 1, 103: 1, 120: 1, 143: 1, 160: 1, 180: 1, 200: 1}]
[-1 {10: 1, 11: 1, 14: 1, 18: 1, 29: 1, 35: 1, 46: 1, 57: 1, 68: 1, 79: 1, 90: 1, 104: 1, 124: 1, 143: 1, 163: 1, 183: 1, 203: 1}]
[1 {9: 1, 11: 1, 14: 1, 18: 1, 30: 1, 35: 1, 46: 1, 57: 1, 68: 1, 79: 1, 90: 1, 103: 1, 123: 1, 143: 1, 163: 1, 183: 1, 204: 1}]
[-1 {10: 1, 12: 1, 14: 1, 18: 1, 33: 1, 36: 1, 45: 1, 56: 1, 67: 1, 78: 1, 89: 1, 100: 1, 120: 1, 140: 1, 160: 1, 193: 1, 203: 1}]

第一个建议效果很好,但是后来我意识到我也将不具有该功能的行切成薄片,但是除了一个超级慢的函数之外,该函数获取添加行的索引,然后将其他行添加到另一组中,我无法正常工作。当我尝试类似的东西时:

helper2 = np.vectorize(not dict.__contains__)

它说“布尔对象不可调用”。

1 个答案:

答案 0 :(得分:0)

这对性能没有帮助,但是您可以在np.vecorize上使用dict.__contains__来模仿numpy索引。

import numpy as np

xs = np.array([[1, {1: 1}], [2, {2: 2}]])

helper = np.vectorize(dict.__contains__)

res = xs[helper(xs[:,1], 1)]
# array([[1, {1: 1}]], dtype=object)

在这里,helper是两个参数的函数。第一个参数是np.ndarray中的dictdict。第二个参数是np.ndarray个要测试的键或一个键。