索引NumPy的二维数组与另一二维数组
m = array([[1, 2],
[4, 5],
[7, 8],
[6, 2]])
和
select = array([0,1,0,0])
我的目标是
result = array([1, 5, 7, 6])
我想_ix正如我在Simplfy row AND column extraction, numpy阅读,但这并没有导致我想要的。
p.s.如果您能想到更精确的问题,请更改此问题的标题。
使用python怎么样?
result = array([subarray[index] for subarray, index in zip(m, select)])
result = array([m[j][0] if i==0 else m[j][1] for i,j in zip(select, range(0, len(m)))])
我更喜欢使用NP.where对于这种索引任务(而不是NP.ix_)
什么没有在OP提到的是,是否结果由位置(源数组中的行/列)或某些条件(例如m> = 5)选择。无论如何,下面的代码片段涵盖了两种情况。
三个步骤:
创建条件数组;
产生索引阵列通过调用NP.where,通过在这种条件 阵列;和
申请这个索引对源阵列
>>> import numpy as NP
>>> cnd = (m==1) | (m==5) | (m==7) | (m==6)
>>> cnd
matrix([[ True, False],
[False, True],
[ True, False],
[ True, False]], dtype=bool)
>>> # generate the index array/matrix
>>> # by calling NP.where, passing in the condition (cnd)
>>> ndx = NP.where(cnd)
>>> ndx
(matrix([[0, 1, 2, 3]]), matrix([[0, 1, 0, 0]]))
>>> # now apply it against the source array
>>> m[ndx]
matrix([[1, 5, 7, 6]])
传递给NP.where的参数,CND,阵列是一个布尔数组,它在这种情况是由复合条件表达式(上面第一行)组成的单个表达式的结果
如果构建这样一个值过滤器并不适用于您的特定用途的情况下,那也没关系,你只需要产生实际的布尔矩阵其他方式(的CND值)(或直接创建) 。
的numpy的办法做到这一点是使用np.choose
或花哨的索引/取(见下文):
m = array([[1, 2],
[4, 5],
[7, 8],
[6, 2]])
select = array([0,1,0,0])
result = np.choose(select, m.T)
所以没有必要蟒蛇循环,或任何东西,所有的速度优势numpy给你。 m.T
只是需要,因为选择实际上是两个阵列之间的更多选择np.choose(select, (m[:,0], m[:1]))
,但其直接使用它就像这样。
使用看中索引:
result = m[np.arange(len(select)), select]
如果速度是非常重要的np.take
,这在一维视图(作品其相当快一点由于某种原因,但也许不是这些细小阵列):
result = m.take(select+np.arange(0, len(select) * m.shape[1], m.shape[1]))
在撰写本文时(np 1.9.2),np.choose()可能会有最大32个元素的严重限制。如果m的长度超过此值,则会收到“ValueError:需要介于2和(32)数组对象(含)之间”。 – 2015-06-12 12:57:30
IMHO,这是最简单的变体:
m[np.arange(4), select]
由于标题所指的索引一个2D阵列与另一2D阵列,一般numpy的办法可以解决here。
简而言之: 形状的指数(N,M)任意大维数m,命名为INDS,用于访问形状的另一二维阵列的元件的2D阵列(N,K),命名乙:
# array of index offsets to be added to each row of inds
offset = np.arange(0, inds.size, inds.shape[1])
# numpy.take(B, C) "flattens" arrays B and C and selects elements from B based on indices in C
Result = np.take(B, offset[:,np.newaxis]+inds)
@NickA谢谢,我添加了解决方案 – Ataxias 2017-08-03 13:00:05
我建议“的名单过滤二维数组”作为标题。 – Adobe 2012-03-27 08:30:47