我有一个数组的L列表:
L = ( array1,
array2,
array3,
array4... )
此列表是从Pandas数据框开始创建的,因此,旧数据框的每一行现在都是列表内的数组。
使用欧几里得距离,我想要:
可视化它:
Iterate through all the arrays
L = ([87, 30, 45, 99],
[11, 21, 31, 41],
[560, 47, 85, 328],
[167, 32, 98, 379] )
Select only arrays in which the 2nd item is included between ` 10 ` and ` 100 `
L = ([87, 30, 45, 99],
[11, 21, 31, 41],
[560, 47, 85, 328],
[85, 33, 43, 97] )
Given an array ` arr1 ` , select the most similar one (let's say ` arr4 ` )
array 1 = ( [87, 30, 45, 99] )
array 4 = ( [85, 32, 43, 97] )
现在让我们呼吁简单:
P * = 30(数组1,第二元素)
X * = 32(数组4,第二个元素)
Replace the *2nd* item in ` arr4 ` (P) inside ` arr1 ` 2nd position (X)
array 1 = ([87, 32, 45, 99])
许多人感谢并前进可能有用的任何提示!
问题来源:stackoverflow
import numpy as np
L = np.array([
[87, 30, 45, 99],
[11, 21, 31, 41],
[560, 47, 85, 328],
[167, 32, 98, 379]
])
对于第2点,您可以使用np.where
,它返回一个condition.nonzero()数组,该数组指示condition为* True *的位置。然后,您可以将该数组作为索引。
result = L[np.where((L[:,1]>10)&(L[:,1]<100))]
对于给定的数组,例如arr1
,我们可以使用以下方法(我不知道它是否是最好的,但是它可以工作)。
L2 = np.array([
[87, 30, 45, 99],
[11, 21, 31, 41],
[560, 47, 85, 328],
[85, 33, 43, 97]
])
def dist(a):
return np.linalg.norm(L2[0]-a)
distances = np.apply_along_axis(dist, 1, L2)
index = np.ma.MaskedArray(result, result==0).argmin() #remove first element which dist is min (0)
print(L2[index])
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。