如何将近邻函数的对象类型转换为整数类型?

时间:2018-10-10 17:57:43

标签: python arrays scikit-learn nearest-neighbor

我正在使用10 x 2304(在Spyder上),并且需要在其上运行NearestNeighbor函数。在变量浏览器下,它声明我的数组属于对象类型,其值是“ numpy值的ndarray对象”(我什至不知道这意味着什么)。当我打印第一行时,这就是我得到的:

>>> print(X)

[array([0, 2, 4, ..., 1, 1, 1], dtype=uint8)
 array([209, 209, 209, ..., 166, 149,  80], dtype=uint8)
 array([161, 159, 167, ..., 192, 186, 194], dtype=uint8)
 array([ 49,  48,  30, ..., 169, 197, 222], dtype=uint8)
 array([175, 173, 165, ...,  95, 153,  77], dtype=uint8)
 array([ 98, 100,  98, ..., 244, 244, 246], dtype=uint8)
 array([ 98,  99,  98, ..., 214, 221, 223], dtype=uint8)
 array([158, 165, 179, ...,  36,  34,  33], dtype=uint8)
 array([177, 168, 166, ..., 185, 183, 178], dtype=uint8)
 array([ 46,  45,  50, ..., 240, 237, 246], dtype=uint8)]

当我将数组作为最邻近函数的参数传递时,出现此错误:

>>> nbrs = NearestNeighbors(n_neighbors=3, algorithm='ball_tree').fit(X)
>>> _, indices = nbrs.kneighbors(X)

ValueError: setting an array element with a sequence.

我已经读到,当输入数组的形状不是可以转换为多维数组的(通用)“盒子”时,会发生这种情况。考虑到我正在使用什么,我觉得这很奇怪,但是我认为这可能是因为我的数组不是我想要的普通“数组数组”。

当我这样做时:

new_X = []
for i in range(10):
    new_X.append(X[i])
new_X = np.array(new_X)
print(new_X)

这是我的结果:

[[  0   2   4 ...   1   1   1]
 [209 209 209 ... 166 149  80]
 [161 159 167 ... 192 186 194]
 ...
 [158 165 179 ...  36  34  33]
 [177 168 166 ... 185 183 178]
 [ 46  45  50 ... 240 237 246]]

还要注意,在变量资源管理器中,它指出new_Xunit8类型的,并且显然是一个数组数组。

>>> nbrs = NearestNeighbors(n_neighbors=3, algorithm='ball_tree').fit(new_X)
>>> _, indices = nbrs.kneighbors(new_X)
>>> print(indices)
[[0 1 3]
 [1 7 2]
 [2 1 3]
 [3 6 8]
 [4 5 8]
 [5 9 4]
 [6 3 8]
 [7 1 0]
 [8 6 3]
 [9 5 6]]

因此您可以看到我得到了想要的结果,但是问题是我正在尝试优化代码。我希望能够在NearestNeighbor上运行X函数,而不必执行我在for循环中所做的操作。有什么方法可以将我的X数组转换为想要的形式和类型而无需循环?

1 个答案:

答案 0 :(得分:1)

ndarray object of numpy value是表示python列表封装在一个名为ndarray的numpy对象中的一种方式,该对象代表n维数组。

在您的情况下,您有list个中的ndarray个。要获取列表列表,可以使用tolist()方法:

X = [i.tolist() for i in X]