Python 使用另一个二维数组索引NumPy二维数组
我有点像Python 使用另一个二维数组索引NumPy二维数组,python,numpy,indexing,scipy,Python,Numpy,Indexing,Scipy,我有点像 m = array([[1, 2], [4, 5], [7, 8], [6, 2]]) 及 我的目标是 result = array([1, 5, 7, 6]) 我边读边试,但这并没有得到我想要的结果 p、 如果你能想出一个更精确的问题,请更改这个问题的标题。使用python怎么样 result = array([subarray[index] for subarray, index in zip(m, sel
m = array([[1, 2],
[4, 5],
[7, 8],
[6, 2]])
及
我的目标是
result = array([1, 5, 7, 6])
我边读边试,但这并没有得到我想要的结果
p、 如果你能想出一个更精确的问题,请更改这个问题的标题。使用python怎么样
result = array([subarray[index] for subarray, index in zip(m, select)])
我更喜欢使用NP.where为这类任务编制索引(而不是NP.ix)
OP中未提及的是结果是按位置(源数组中的行/列)还是按某些条件(例如,m>=5)选择的。无论如何,下面的代码片段涵盖了这两种情况
三个步骤:
传递给NP.where的参数cnd是一个布尔数组,在本例中,它是由复合条件表达式(上面第一行)组成的单个表达式的结果 如果构建这样一个值过滤器不适用于您的特定用例,那很好,您只需要以其他方式(或直接创建)生成实际的布尔矩阵(cnd的值)。实现这一点的基本方法是使用
np。选择或花式索引/获取(见下文):
因此,不需要python循环或其他任何东西,numpy提供了所有的速度优势m.T
是必需的,因为choose实际上更像是两个数组之间的选择np.choose(select,(m[:,0],m[:1])
,但这样使用它很简单
使用花式索引:
如果速度是非常重要的np.take
,它可以在1D视图上工作(出于某种原因,速度会快一些,但对于这些微小的阵列可能不会):
嗯,这是最简单的变体:
m[np.arange(4), select]
由于标题是指用另一个2D数组索引一个2D数组,因此可以找到实际的通用numpy解决方案
简言之:
具有任意大尺寸m的形状(n,m)的二维索引数组名为inds
,用于访问另一个二维形状数组(n,k)(名为B
)的元素:
# 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)
另一个解决方案,不使用np.take
,我发现更直观的是:
B[np.expand_dims(np.arange(B.shape[0]), -1), inds]
这种语法的优点是,它既可以用于基于inds
(如np.take
)从B
读取元素,也可以用于赋值。我建议将“按列表过滤2D数组”作为标题。在撰写本文(np 1.9.2)时,np.choose()可能有最多32个元素的严重限制。如果m的较长维度超过此值,则我会收到“ValueError:需要2到(32)个数组对象(包括)
m = array([[1, 2],
[4, 5],
[7, 8],
[6, 2]])
select = array([0,1,0,0])
result = np.choose(select, m.T)
result = m[np.arange(len(select)), select]
result = m.take(select+np.arange(0, len(select) * m.shape[1], m.shape[1]))
m[np.arange(4), select]
# 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)
B[np.expand_dims(np.arange(B.shape[0]), -1), inds]