Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ValueError:操作数无法与获取sklearn的BallTree邻居的平均距离的形状一起广播_Python_Numpy_Scikit Learn - Fatal编程技术网

Python ValueError:操作数无法与获取sklearn的BallTree邻居的平均距离的形状一起广播

Python ValueError:操作数无法与获取sklearn的BallTree邻居的平均距离的形状一起广播,python,numpy,scikit-learn,Python,Numpy,Scikit Learn,当我试图获得50个点的邻域的平均距离时,得到了错误“ValueError:操作数无法与形状(5,)(4,)”一起广播。使用sklearn的BallTree函数计算邻域的距离。这个函数的查询返回一个numpy双数组,其中包含中心点和邻域之间的距离,我搜索得到中心点和邻域之间的平均距离 代码如下: import numpy as np import sklearn.neighbors rng = np.random.RandomState(0) X = rng.random_sample((50,

当我试图获得50个点的邻域的平均距离时,得到了错误“ValueError:操作数无法与形状(5,)(4,)”一起广播。使用sklearn的BallTree函数计算邻域的距离。这个函数的查询返回一个numpy双数组,其中包含中心点和邻域之间的距离,我搜索得到中心点和邻域之间的平均距离

代码如下:

import numpy as np
import sklearn.neighbors

rng = np.random.RandomState(0)
X = rng.random_sample((50, 3))

treeBall_Neighbors = sklearn.neighbors.BallTree(X, leaf_size=2)
indices_Neighbors,distance_Neighbors=treeBall_Neighbors.query_radius(X[:], r=0.2,count_only=False,return_distance=True)

print(distance_Neighbors.mean())
这很奇怪,因为如果我试图一个接一个地获得平均距离,我不会得到错误:

print(distance_Neighbors[0].mean())
print(distance_Neighbors[1].mean())
...

你能帮我在不使用for循环的情况下获得一个包含邻居平均值的numpy数组吗?

不幸的是,我认为你运气不好。让我们看看邻居之间的距离是什么:

distance_Neighbors

array([array([0.19662693, 0.        , 0.12978415, 0.15542077, 0.19196227]),
       array([0.        , 0.10668909, 0.1864282 , 0.15770229]),
       array([0.]), array([0.14046915, 0.        , 0.19662693]),
       ...
       array([0.15770229, 0.15542077, 0.166294  , 0.08416146, 0.        ]),
       array([0.16614007, 0.        , 0.18970757, 0.19556229, 0.11739919]),
       array([0.]), array([0.]), array([0.])], dtype=object)
这是一个参差不齐的数组,
dtype=object
——在
numpy
中,它不是一个有用的数据类型(当您尝试时,它们往往会导致奇怪的错误,比如您发现的错误)。这不是你的错,这就是sklearn的输出,但是你像一个列表一样被卡住了,因为一个不规则的数组
dtype=object
基本上并不比列表好多少

第二个问题是,所有这些数组中都有一个
0.0
,这会影响你的平均值。如果您不介意没有邻居为nan的结果,您可以执行以下操作:

[a[a>0].mean() for a in distance_Neighbors]
Out[13]: 
[0.1684485306859162,
 0.1502731942636554,
 nan,
 0.1685480404455817,
 0.14716664746268726,
 ...
 0.16064019067059504,
 0.17164368138912153,
 0.14089463228303245,
 0.16720227805614482,
 nan,
 nan,
 nan]

如果您想用其他方法来处理它们,您需要为循环创建一个真正的
。如果您根本不想处理这些问题,只需使用
[a.mean()表示距离较远的邻居]

非常感谢您的回答。多亏了它,我找到了解决这个问题的方法。最后,我的代码看起来像:
f=lambda x:distance\u neights[x].mean()
test=list(map(f,np.arange(0,np.shape(distance\u neights)[0]))
我使用lambda来提高处理速度。现在我正在管理3亿点,这就是避免循环的原因。。。再次感谢!其他快速解决方案:np.矢量化(np.平均值)(距离\邻域)