a = np.zeros((5,4,3))
v = np.ones((5, 4), dtype=int)
data = a[v]
shp = data.shape
此代码为shp==(5,4,4,3)
我不明白为什么。如何输出更大的数组?对我来说毫无意义,并且很想解释。
答案 0 :(得分:6)
这被称为advanced indexing。高级索引使您可以基于N维索引在输入数组中选择任意元素。
让我们使用另一个示例使其更清楚:
a = np.random.randint(1, 5, (5,4,3))
v = np.ones((5, 4), dtype=int)
在这种情况下说a
是:
array([[[2, 1, 1],
[3, 4, 4],
[4, 3, 2],
[2, 2, 2]],
[[4, 4, 1],
[3, 3, 4],
[3, 4, 2],
[1, 3, 1]],
[[3, 1, 3],
[4, 3, 1],
[2, 1, 4],
[1, 2, 2]],
...
通过索引np.ones
数组:
print(v)
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])
您将简单地沿第一轴用a
索引1
多达v
。当您这样做时,换一种说法:
a[1]
[[4, 4, 1],
[3, 3, 4],
[3, 4, 2],
[1, 3, 1]]
您正在沿第一个轴分度,因为没有沿附加轴指定分度。这与进行a[1, ...]
相同,即沿其余轴取一整片。因此,通过用2D
数组组成的索引,可以将上述2D
个数组(5, 4)
堆叠在一起,得到形状为(5, 4, 4, 3)
的ndarray。换句话说,a[1]
的形状为(4,3)
,堆积了5*4=20
次。
因此,在这种情况下,您将得到:
array([[[[4, 4, 1],
[3, 3, 4],
[3, 4, 2],
[1, 3, 1]],
[[4, 4, 1],
[3, 3, 4],
[3, 4, 2],
[1, 3, 1]],
...
答案 1 :(得分:0)
a是具有2维的数组 v是具有3维的数组 数据是4维数组
当您使用2维数组访问3维数组时,会为其添加一个维。
想象一下,您为3d空间中的每个点应用了2d空间,它将为3d空间添加另一个尺寸。创建更大的4d空间。
那只是我的猜测,我真的是专家的对立面,所以我要回答我的问题哈哈!
答案 2 :(得分:0)
v
的值是:
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
每个1
都在a
中索引一个完整的“行”,但是所说“行”中的每个“元素”都是一个矩阵。因此v
中的每个“行”都在a
中索引了“矩阵”的“行”。
(这对您有意义吗??)
所以您得到5 * 4 1
,每个都是4 * 3的“矩阵”。
如果您将zeroes
定义为a
而不是a = np.arange(5*4*3).reshape((5, 4, 3))
可能更容易理解,因为您可以看到正在选择a
的哪些部分:
import numpy as np
a = np.arange(5*4*3).reshape((5, 4, 3))
v = np.ones((5,4), dtype=int)
data = a[v]
print(data)
(输出时间很长,我不想将其粘贴到此处)