如何在numpy数组中找到列的一部分的最小值?

时间:2015-03-01 21:05:05

标签: python arrays numpy

我有一个像下面那样的numpy数组,它有三列,col.1是距离col。 2和3是节点的id。我想找到距离第1列的最小距离,但仅限于节点ID为0.

distance   i    j
[[ 1.18801546  0.          1.        ]
 [ 2.30434659  0.          2.        ]
 [ 3.46650731  0.          3.        ]
 [ 0.85449778  0.          4.        ]
 [ 0.84375971  0.          5.        ]
 [ 2.66327706  0.          6.        ]
 [ 1.84376278  0.          7.        ]
 [ 1.29614483  0.          8.        ]
 [ 2.86955783  0.          9.        ]
 [ 1.55222839  1.          2.        ]
 [ 2.56904021  1.          3.        ]
 [ 0.56480212  1.          4.        ]
 [ 0.81877367  1.          5.        ]
 [ 2.87466569  1.          6.        ]
 [ 1.01649384  1.          7.        ]
 [ 1.95662814  1.          8.        ]
 [ 3.15455155  1.          9.        ]
 [ 1.1897445   2.          3.        ]
 [ 1.65880881  2.          4.        ]
 [ 2.21427178  2.          5.        ]
 [ 2.12770111  2.          6.        ]
 [ 0.59811712  2.          7.        ]
 [ 2.15373458  2.          8.        ]
 [ 2.47151944  2.          9.        ]
 [ 2.78849347  3.          4.        ]
 [ 3.29699194  3.          5.        ]
 [ 2.90479808  3.          6.        ]
 [ 1.6405647   3.          7.        ]
 [ 3.2628552   3.          8.        ]
 [ 3.24135083  3.          9.        ]
 [ 0.59483003  4.          5.        ]
 [ 2.55441835  4.          6.        ]
 [ 1.22876339  4.          7.        ]
 [ 1.62616729  4.          8.        ]
 [ 2.7776452   4.          9.        ]
 [ 3.07635954  5.          6.        ]
 [ 1.7483827   5.          7.        ]
 [ 1.993107    5.          8.        ]
 [ 3.26526698  5.          9.        ]
 [ 2.34443787  6.          7.        ]
 [ 1.59405468  6.          8.        ]
 [ 0.46781919  6.          9.        ]
 [ 1.92762241  7.          8.        ]
 [ 2.69818642  7.          9.        ]
 [ 1.85007201  8.          9.        ]]

我尝试过使用

print all_data[np.argmax(all_data[:, 0]), 1]

但它返回整列的最低值,不仅仅是我想要的节点0。如何获得仅与节点'0'相关联的最小值? argmin值似乎也被四舍五入!知道如何解决这些问题吗?顺便说一句,我正在使用numpy数组。

3 个答案:

答案 0 :(得分:2)

您可以找到带有0作为第二个索引的元素,all_data[all_data[:, 1]==0]

print all_data[np.argmax(all_data[all_data[:, 1]==0]), 1]

答案 1 :(得分:2)

来自OP问题

  

如何获得仅与节点'0'相关联的最小值?

In [1]: import numpy as np

In [2]: a=np.array([[ 1.18801546, 0., 1., ],
   ...:  [ 2.30434659, 0., 2., ],
   ...:  [ 3.46650731, 0., 3., ],
   ...:  [ 0.85449778, 0., 4., ],
   ...:  ...
   ...:  [ 1.29614483, 0., 8., ],
   ...:  [ 2.86955783, 0., 9., ],])

导入numpy并将数组创建为a后,我们使用布尔数组a[:,1]==0.0在其上创建一个视图,并使用numpy函数{找到第一列的最小值{ {1}},使用可选参数min限制搜索axis=0列中的最小值。

0

就是这样。

如果你想要第0列中的最小值,那么你可以获得每列的最小值,然后是表达式

In[3]: np.min(a[a[:,1]==0.0],axis=0)
Out[3]: array([ 0.84375971,  0.        ,  1.        ])

给你--- OTOH,如果你想要最小值的行,它会有点不同

np.min(a[a[:,1]==0.0],axis=0)[0]

即使我们在单个表达式中编写a[np.argmin(a[a[:,1]==0],axis=0)[0]] 三次这样的事实看起来有点不自然,它也能完成它的工作。

答案 2 :(得分:1)

过滤第0列中所选值的数据,然后计算最小距离:

selected_value = 0
value_col = 0  # The column containing the selected value.
dist_col = 1  # The column containing the distance value.
min_val = all_data[all_data[:, value_col] == selected_value, dist_col].min()