我正在尝试创建一个新的2维或2列数组,它将包含来自第一列的(数据值< = 20000),以及它们在第二列中的关联ID值。在数学上我正在做以下事情: 我正在从文本文件中读取数据。我找到距离最后一点所有点的距离。
# Find nearest neighbors
import numpy as np
import matplotlib.pyplot as plt
halo = 'nntest.txt'
ID, m,r,x,y,z= np.loadtxt(halo, usecols=(0,6,7,8,9,10), unpack =True)
# selet the last point
m_mass = m[-1:]
ID_mass = ID[-1:]
r_mass = r[-1:]
x_mass = x[-1:]
y_mass = y[-1:]
z_mass = z[-1:]
#######################################
#Find distance to all points from our targeted point
nearest_neighbors = []
def neighbors(ID_mass, cx,cy,cz, ID, x, y, z):
dist = np.sqrt((cx-x)**2 + (cy-y)**2 + (cz-z)**2)
return dist, ID
for i in range(len(ID_mass)):
hist = neighbors(ID_mass[i], x_mass[i], y_mass[i], z_mass[i], ID, x, y, z)
print hist
#print all the IDs which are associated with dist<=20000
if (hist[0]<=20000):
print ID
nearest_neighbors.append(hist)
print nearest_neighbors
在我得到距离后,我只想从我的计算中获取距离&lt; = 20,000以及它们相关的ID列。
到目前为止,我编写了此代码以返回计算的距离和ID:
{440059=1, Champagne,, 440055=5, Noodle,, 440057=2, Salad Soup,}
但是我在返回新数组时遇到问题,该数组只包含距离&lt; = 20000,以及相关的ID。如果这不是一个好的工作示例,我会提前道歉。但我非常感谢您提出的建议,以获得所需的输出。
答案 0 :(得分:1)
在您提出的问题和您提供的代码之间,我仍然不清楚您要完成什么。但我至少可以向您展示代码中存在错误的位置,并且可能会为您提供所需的工具。
现在你的代码是,x,y,z都是向量。所以邻居距离计算的结果,
dist = np.sqrt((cx-x)**2 + (cy-y)**2 + (cz-z)**2)
将是一个向量。我认为这是你的意图,因为其他值被索引。但这意味着你遇到麻烦
if (hist[0]<=20000):
print ID
Numpy会将不平等视为掩码,因此hist[0]<=2000
看起来像[True, False, False, ...]
。如果使用得当,我认为numpy数组面具非常适合您的需求。
例如,您可以尝试
for i in range(len(ID_mass)):
hist = neighbors(ID_mass[i], x_mass[i], y_mass[i], z_mass[i], ID, x, y, z)
print hist
#print all the IDs which are associated with dist<=20000
print ID[hist[0]<=20000]
nearest_neighbors.extend(list(zip(hist[0][hist[0]<=20000],ID[hist[0]<=20000])))
print nearest_neighbors
我们扩展nearest_neighbors列表的这一行有点混乱,我可能还没有完全理解你希望输出看起来像什么。但是这将创建一个元组列表,其中每个元组包含距离值和距离小于20000的所有情况的ID。