最近邻函数如何将对象类型转换为整数类型?
How to convert object type to integer type for Nearest Neighbor function?
我正在使用 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.
我读到,当输入数组的形状不是可以转换为多维数组的(通用)"box" 时会发生这种情况。考虑到我正在使用的东西,我觉得这很奇怪,但我认为这可能是因为我的数组不是我想要的普通 "array of arrays"。
当我这样做时:
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]]
如您所见,我得到了我正在寻找的结果,但问题是我正在尝试优化我的代码。我希望能够在 X
上 运行 NearestNeighbor
函数,而不必执行我在 for 循环中所做的操作。有什么方法可以将我的 X
数组转换为我想要的形式和类型而无需循环?
A ndarray object of numpy value
是一种表示您的 python 列表封装在一个名为 ndarray
的 numpy 对象中的方法,它代表 n 维数组。
在您的情况下,您有 list
个 ndarray
。要获取列表列表,可以使用 tolist()
方法:
X = [i.tolist() for i in X]
我正在使用 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.
我读到,当输入数组的形状不是可以转换为多维数组的(通用)"box" 时会发生这种情况。考虑到我正在使用的东西,我觉得这很奇怪,但我认为这可能是因为我的数组不是我想要的普通 "array of arrays"。
当我这样做时:
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]]
如您所见,我得到了我正在寻找的结果,但问题是我正在尝试优化我的代码。我希望能够在 X
上 运行 NearestNeighbor
函数,而不必执行我在 for 循环中所做的操作。有什么方法可以将我的 X
数组转换为我想要的形式和类型而无需循环?
A ndarray object of numpy value
是一种表示您的 python 列表封装在一个名为 ndarray
的 numpy 对象中的方法,它代表 n 维数组。
在您的情况下,您有 list
个 ndarray
。要获取列表列表,可以使用 tolist()
方法:
X = [i.tolist() for i in X]