1

我正在尝试将 2d 数组的值与列表进行匹配,以便创建一个新的 2d 数组,其中包含列表及其来自 2d 数组的相应值。用代码可能比英语更容易理解......

import numpy as np

m_out = np.arange(50).reshape(25,2)
m_out_list = list(m_out[:,1])

eqn_out = range(7,17)

c_list = [(x,y) for x in eqn_out for y in m_out[:,0] if x in (m_out_list)]

print c_list

这段代码产生了我期望的答案,

[(7, 0), (7, 2), (7, 4), (7, 6), ...

然而,这不是我想要完成的。我希望列表理解的最后一部分(或任何其他有效的方法)是提供一个数组,该数组将 eqn_out 列表与其对应的唯一原始值相匹配;IE

[(7,6), (9,8), (11,10), (13,12), (15,14), (17,16)]

我不确定如何准确地做到这一点,任何建议将不胜感激。

4

2 回答 2

3

像这样的东西:

[(j, i) for (i,j) in m_out if j in eqn_out]

似乎工作。然而,这可能有点浪费,因为我们迭代的是整体m_out而不是子集。

一种替代方法可能是:

test = reduce(np.logical_or,v(m_out[:,1]==i for i in eqn_out))
[(j,i) for (i,j) in m_out[test]]

在这里,我们迭代len(eqn_out)布尔数组,我们将其与reduce(np.logical_or, ...). 我们使用这个布尔数组来选择我们想要的项目m_out。因为您希望第二列的元素排在第一位,所以我们必须使用最后一个列表推导。

请注意,它需要创建至少 2 N 个布尔数组,这可能比第一个解决方案更浪费……不过,这两种解决方案都可以轻松应用于多于 2 的列。

于 2012-09-03T23:18:45.837 回答
3

[编辑将更简单的方法放在首位。]

在实践中,我可能会这样做:

In [166]: d = dict(m_out[:,::-1])
In [167]: [(k, d[k]) for k in eqn_out if k in d]
Out[167]: [(7, 6), (9, 8), (11, 10), (13, 12), (15, 14), (17, 16)]

但是为了好玩,坚持使用 numpy,比如:

[更新:更好的 numpy 方法]:

In [15]: m_out[np.in1d(v, eqn_out)][:, ::-1]
Out[15]: 
array([[ 7,  6],
       [ 9,  8],
       [11, 10],
       [13, 12],
       [15, 14],
       [17, 16]])

或者我原来的 numpy 方法:

In [150]: import numpy as np
In [151]: m_out = np.arange(50).reshape(25,2)   
In [152]: v = m_out[:,1]    
In [153]: eqn_out = np.arange(7, 18)     
In [154]: eqn_out
Out[154]: array([ 7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17])

只保留我们知道的价值观:

In [155]: np.intersect1d(eqn_out, v)
Out[155]: array([ 7,  9, 11, 13, 15, 17])

查找它们所在的位置(假设数据已排序!!):

In [156]: v.searchsorted(np.intersect1d(eqn_out, v))
Out[156]: array([3, 4, 5, 6, 7, 8])

使用这些索引进行选择:

In [157]: m_out[v.searchsorted(np.intersect1d(eqn_out, v))]
Out[157]: 
array([[ 6,  7],
       [ 8,  9],
       [10, 11],
       [12, 13],
       [14, 15],
       [16, 17]])

翻动:

In [158]: m_out[v.searchsorted(np.intersect1d(eqn_out, v))][:,::-1]
Out[158]: 
array([[ 7,  6],
       [ 9,  8],
       [11, 10],
       [13, 12],
       [15, 14],
       [17, 16]])
于 2012-09-03T23:23:17.000 回答