首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于Numpy的类MATLAB数组索引

基于Numpy的类MATLAB数组索引
EN

Stack Overflow用户
提问于 2012-07-09 18:21:40
回答 3查看 6.2K关注 0票数 11

在MATLAB和Numpy中,数组都可以通过数组进行索引。但是,行为是不同的。让我用一个例子来解释这一点。

MATLAB:

代码语言:javascript
复制
>> A = rand(5,5)

A =

    0.1622    0.6020    0.4505    0.8258    0.1067
    0.7943    0.2630    0.0838    0.5383    0.9619
    0.3112    0.6541    0.2290    0.9961    0.0046
    0.5285    0.6892    0.9133    0.0782    0.7749
    0.1656    0.7482    0.1524    0.4427    0.8173

>> A([1,3,5],[1,3,5])

ans =

    0.1622    0.4505    0.1067
    0.3112    0.2290    0.0046
    0.1656    0.1524    0.8173

Numpy:

代码语言:javascript
复制
In [2]: A = arange(25).reshape((5,5))

In [3]: A
Out[3]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

In [6]: A[[0,2,4], [0,2,4]]
Out[6]: array([ 0, 12, 24])

换句话说: MATLAB选择行和列,Numpy“压缩”两个索引数组,并使用元组指向条目。

如何使用Numpy获得MATLAB的行为?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-09 18:52:05

您可以这样做:

代码语言:javascript
复制
A[[0,2,4],:][:,[0,2,4]]

这将给出您想要的类似MATLAB的结果。

值得注意的是,如果你使用切片进行索引,那么你就会得到类似于MATLAB的结果,而不需要任何这样的破解:

代码语言:javascript
复制
>>> A[1:3,1:3]
array([[ 6, 7],
       [11,12]])

与MATLAB不同,在[1,2]中,1:3不仅仅是numpy或任何类似东西的缩写。(在这一点上,我觉得有必要提到一些您肯定已经知道的事情,即Python语言的1:3有点像[1,2],而MATLAB的语言有点像[1,2,3]:右边的端点包含在MATLAB中,而不包括在Python中。)

票数 13
EN

Stack Overflow用户

发布于 2012-07-09 19:14:19

你可以使用辅助函数numpy.ix_来获取Matlab的行为:

代码语言:javascript
复制
from numpy import ix_
A[ ix_( [0,2,4], [0,2,4] ) ]
票数 18
EN

Stack Overflow用户

发布于 2013-07-18 04:21:37

使用numpy执行此操作的有效方法是重塑索引数组,使其与它们所索引的轴相匹配。

代码语言:javascript
复制
In [103]: a=numpy.arange(100).reshape(10,10)

In [104]: a
Out[104]: 
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
   [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
   [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
   [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
   [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
   [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
   [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
   [70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
   [80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
   [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])

In [105]: x=numpy.array([3,6,9])

In [106]: y=numpy.array([2,7,8])

In [107]: a[x[:,numpy.newaxis],y[numpy.newaxis,:]]
Out[107]: 
array([[32, 37, 38],
      [62, 67, 68],
      [92, 97, 98]])

Numpy的广播规则是你的朋友(比matlab好得多)……

HTH

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11393140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档