因此,我创建了一个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)
很明显我在这里什么都不懂。尽管如此,有时用列表切片可能非常有用。
干杯,
坑
发布于 2020-01-14 19:52:39
你观察到了所谓的高级索引效应。让我们考虑一下链接中的例子:
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]
您可能会认为这是提供(笛卡尔)网格坐标的列表,如
print(x[0,1]) # 1
print(x[1,1]) # 4
print(x[2,0]) # 5
发布于 2020-01-14 19:45:23
在最后一种情况下,这两个单独的列表被视为单独的索引操作(这是非常尴尬的措辞,请原谅我)。
Numpy看到两个由两个整数组成的列表,并决定您因此需要两个值。每个值的行索引来自第一个列表,而每个值的列索引来自第二个列表。因此,您可以得到a[1,1]
和a[2,2]
。:
表示法不仅扩展到您精确推导的列表,而且还告诉numpy您想要该范围内的所有行/列。
如果您提供手动管理的列表索引,它们必须具有相同的大小,因为每个/任意列表的大小是您将返回的元素的数量。例如,如果希望第1行第1和第2列中的元素为1、2、3:
>>> a[1:4,[1,2]]
array([[ 6, 7],
[11, 12],
[16, 17]])
但
>>> 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?)
上给我元素”。
发布于 2020-01-14 19:46:42
a[[1,2],[1,2]]
正在读这个,我想要一个1,1和2,2。有几种方法可以解决这个问题,我可能没有最好的方法,但你可以试试。
a[[1,1,2,2],[1,2,1,2]]
这将给您一个扁平的版本以上。
a[[1,2]][:,[1,2]]
这将给出正确的切片,它可以接受行1,2,然后列1,2。
https://stackoverflow.com/questions/59740566
复制相似问题