Как преобразовать тип объекта в целочисленный тип для функции ближайшего соседа? - PullRequest
0 голосов
/ 10 октября 2018

Я работаю с 10 x 2304 (на Spyder), и мне нужно запустить на нем функцию NearestNeighbor.Под исследователем переменных он утверждает, что мой массив относится к типу объектов, а его значение равно «ndarray object of numpy value» (я даже не знаю, что это должно означать).Когда я печатаю первые строки, это то, что я получаю:

>>> 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.

I 'мы читали, что это то, что происходит, когда форма входного массива не является (обобщенным) «прямоугольником», который можно превратить в многомерный массив.Я нахожу это странным, учитывая то, с чем я работаю, но я полагаю, что это может быть из-за того факта, что мой массив не является обычным «массивом массивов», как мне хотелось бы.

Когда я делаю это:

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_X относится к типу unit8, и это явно массив массивов.

>>> 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 голосов
/ 10 октября 2018

A ndarray object of numpy value - это способ сказать, что ваш список Python инкапсулирован в простой объект с именем ndarray, который обозначает n-мерный массив.

В вашем случае у вас есть list из ndarray с.Чтобы получить список, вы можете использовать метод tolist():

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