首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用列表对数组进行切片

用列表对数组进行切片
EN

Stack Overflow用户
提问于 2020-01-14 19:32:15
回答 4查看 160关注 0票数 8

因此,我创建了一个numpy数组:

a = np.arange(25).reshape(5,5)

数组([ 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])

传统的切片a[1:3,1:3]返回

数组([ 6,7,11,12])

就像在第二个a[1:3,[1,2]]中使用列表一样

数组([ 6,7,11,12])

但是,a[[1,2],[1,2]]返回

阵列( 6,12)

很明显我在这里什么都不懂。尽管如此,有时用列表切片可能非常有用。

干杯,

EN

回答 4

Stack Overflow用户

发布于 2020-01-14 19:52:39

你观察到了所谓的高级索引效应。让我们考虑一下链接中的例子:

代码语言:javascript
运行
复制
import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
print(x)
[[1 2]
 [3 4]
 [5 6]]
print(x[[0, 1, 2], [0, 1, 0]])  # [1 4 5]

您可能会认为这是提供(笛卡尔)网格坐标的列表,如

代码语言:javascript
运行
复制
print(x[0,1])  # 1
print(x[1,1])  # 4
print(x[2,0])  # 5
票数 2
EN

Stack Overflow用户

发布于 2020-01-14 19:45:23

在最后一种情况下,这两个单独的列表被视为单独的索引操作(这是非常尴尬的措辞,请原谅我)。

Numpy看到两个由两个整数组成的列表,并决定您因此需要两个值。每个值的行索引来自第一个列表,而每个值的列索引来自第二个列表。因此,您可以得到a[1,1]a[2,2]:表示法不仅扩展到您精确推导的列表,而且还告诉numpy您想要该范围内的所有行/列。

如果您提供手动管理的列表索引,它们必须具有相同的大小,因为每个/任意列表的大小是您将返回的元素的数量。例如,如果希望第1行第1和第2列中的元素为1、2、3:

代码语言:javascript
运行
复制
>>> a[1:4,[1,2]]
array([[ 6,  7],
       [11, 12],
       [16, 17]])

代码语言:javascript
运行
复制
>>> a[[1,2,3],[1,2]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (2,)

前者告诉numpy您需要一系列的行和特定的列,而后者则说“在(1,1)(2,2)(3, hey! what the?! where's the other index?)上给我元素”。

票数 0
EN

Stack Overflow用户

发布于 2020-01-14 19:46:42

a[[1,2],[1,2]]正在读这个,我想要一个1,1和2,2。有几种方法可以解决这个问题,我可能没有最好的方法,但你可以试试。

代码语言:javascript
运行
复制
a[[1,1,2,2],[1,2,1,2]]

这将给您一个扁平的版本以上。

代码语言:javascript
运行
复制
a[[1,2]][:,[1,2]]

这将给出正确的切片,它可以接受行1,2,然后列1,2。

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

https://stackoverflow.com/questions/59740566

复制
相关文章

相似问题

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